Wikipedia
testwiki
https://test.wikipedia.org/wiki/Main_Page
MediaWiki 1.47.0-wmf.7
first-letter
Media
Special
Talk
User
User talk
Wikipedia
Wikipedia talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Thread
Thread talk
Summary
Summary talk
Test namespace 1
Test namespace 1 talk
Test namespace 2
Test namespace 2 talk
Draft
Draft talk
Campaign
Campaign talk
TimedText
TimedText talk
Module
Module talk
SecurePoll
SecurePoll talk
CNBanner
CNBanner talk
Translations
Translations talk
Event
Event talk
Topic
Newsletter
Newsletter talk
Ikipedia:Illage Ump
0
2826
747666
735778
2026-06-20T13:20:15Z
User97104
72884
User97104 moved page [[Wikipedia:Village Pump]] to [[Ikipedia:Illage Ump]]: Test: H
735778
wikitext
text/x-wiki
== Test section ==
Test content, will revert to redirect to [[Wikipedia:Village pump]]. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:06, 27 March 2026 (UTC)
:Test message. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:28, 27 March 2026 (UTC)
::Hi. [[Special:Contributions/~2026-19047-84|~2026-19047-84]] ([[User talk:~2026-19047-84|talk]]) 13:29, 27 March 2026 (UTC)
== [[Markup|markup]] section ==
What about another with the same title? [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:29, 27 March 2026 (UTC)
:Hi, [[User:Samwalton9|Samwalton9]] ([[User talk:Samwalton9|talk]]) 13:29, 27 March 2026 (UTC)
::Test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC)
== "Test" section ==
Test. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:37, 27 March 2026 (UTC)
:A [[User:Samwalton9|Samwalton9]] ([[User talk:Samwalton9|talk]]) 13:37, 27 March 2026 (UTC)
::test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC)
:::test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC)
rmz70upckkzu57w6c6efvo0ob15m0yt
News
0
92775
747688
576256
2026-06-20T14:47:33Z
97104-Test
74540
Blanked the page
747688
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
747689
747688
2026-06-20T14:47:36Z
AutoModeratorTest
61468
Reverted edit by [[Special:Contributions/97104-Test|97104-Test]] ([[User talk:97104-Test|talk]]) to last revision by [[User:TSevener (WMF)|TSevener (WMF)]]
576256
wikitext
text/x-wiki
{{Short description|Disused railway locomotive depot in the West Midlands, England}}
{{Use British English|date=January 2017}}
{{Use dmy dates|date=January 2017}}
{{Infobox Railway Depot
| name = Saltley TMD
| image = Saltley Depot (geograph 2326121).jpg
| image_size =
| caption = [[British Rail Class 31|Class 31]] and [[British Rail Class 47|Class 47]] locomotives at Saltley Depot in 1991
| location = [[Saltley]], [[Birmingham]]
| coordinates = {{coord|52.4862|-1.8655|type:landmark_region:GB_scale:2000_source:Google|display=inline,title}}
| grid_ref_UK = SP092875
| owner = [[British Rail]]
| depotcode = SY (1973 - 2005)<ref name="TRC">{{cite web|url=http://www.therailwaycentre.com/Resource_data/AllTimeShedCodes.pdf|title=The all-time guide to UK Shed and Depot Codes|date=5 May 2006|work=TheRailwayCentre.com|access-date=19 August 2016|url-status=usurped|archive-url=https://web.archive.org/web/20131217221651/http://www.therailwaycentre.com/Resource_data/AllTimeShedCodes.pdf|archive-date=17 December 2013}}</ref>
| type = [[Diesel Locomotive|Diesel]]
| opened = 1868<ref name=STMDhistory>{{cite web|url=http://www.disused-stations.org.uk/features/saltley_loco_shed/index.shtml|title=Disused Stations: Saltley Locomotive Shed|work=Disused Stations|access-date=8 January 2017}}</ref>
| closed = 2005
| former_depot_codes = {{ubl|21A (1948 - 31 August 1963)|2E (1 September 1963 - 5 May 1973)}}
}}
'''Saltley TMD''' was a [[traction maintenance depot]] located in [[Saltley]], [[Birmingham]], England. The depot was situated on the east side of the line between [[Birmingham New Street railway station|Birmingham New Street]] and [[Water Orton railway station|Water Orton]], and was near [[Saltley railway station|Saltley station]] until the station closed in 1968.
The depot code was SY.<ref>{{harvnb|Webster|Greengrass|Greaves|1987|p=69}}</ref>
== History ==
The steam loco shed closed to steam 6 March 1967, but a locomotive inspection point was built along with a few offices. From 1948 to 2008, [[British Rail Class 08|Class 08 shunters]], [[British Rail Class 11|Class 11]], [[British Rail Class 25|25]], [[British Rail Class 27|27]], [[British Rail Class 30|30]], [[British Rail Class 37|37]], [[British Rail Class 44|44]], [[British Rail Class 45|45]], [[British Rail Class 47|47]],<ref name=STMDallocation1>{{cite web|url=http://www.brdatabase.info/sites.php?page=depots&subpage=locos&id=463|title=Locomotive Depots: Saltley (Allocation)|work=BRDatabase|access-date=8 January 2017}}</ref> [[British Rail Class 20|20]], [[British Rail Class 31|31]], [[British Rail Class 40|40]], [[British Rail Class 50|50]] and [[British Rail Class 56|56]] could be seen at the depot.The loco inspection point was open until 2005 and the locomotives moved to other depots, with the last one leaving in 2008.
== Present ==
The offices are still open and are a signing on point for DB Schenker drivers but the depot is derelict and there are no trains present.
== References ==
{{commonscat|Saltley engine shed|Saltley TMD}}
{{Reflist}}
===Sources===
*{{cite book|title=British Rail Depot Directory|year=1987|first1=Neil|last1=Webster|first2=Robert|last2=Greengrass|first3=Simon|last3=Greaves|publisher=Metro Enterprises Ltd.|isbn=9780947773076|oclc=20420397}}
[[Category: Railway depots in England]]
s1l97xefhg6921te9ejv1pfjwt6o19v
Template:K12
10
98212
747684
728170
2026-06-20T14:08:19Z
97104-Test
74540
Replaced content with "Olleh, e"
747684
wikitext
text/x-wiki
Olleh, e
hzs8zrk3x4l3227ll5tyas25dpb7g98
Flagtest
0
100343
747680
358748
2026-06-20T14:02:00Z
User97104
72884
747680
wikitext
text/x-wiki
{{flag|United States}}
k1y2xxzted6lwryjl6y1yj5oqpp19yo
User:Petrb/huggle.yaml.js
2
105264
747803
738835
2026-06-21T10:12:23Z
Petrb
15387
Updating the user configuration page... HG (3.4.14)
747803
javascript
text/javascript
---
# // This is a configuration of huggle, do not change it unless you know what you are doing.
enable: true
# // Last version of huggle that wrote into this configuration file (sanity check)
version: "3.4.14 build: 4373 3.4.14-57-ge3abc7b1"
report-summary: ""
confirm-multiple: false
confirm-talk: true
confirm-self-revert: true
confirm-whitelist: true
# // This option will change the behaviour of automatic resolution, be careful
revert-on-multiple-edits: true
automatically-resolve-conflicts: true
software-rollback: false
enforce-months-as-headers: true
history-load: true
on-next: 1
delete-edits-after-revert: true
skip-to-last-edit: false
preferred-provider: 2
remove-oldest-queue-edits: false
truncate-edits: false
talkpage-freshness: 20
remove-after-trusted-edit: true
# // Get original creator of every page so that you can G7 instead of reverting the page
retrieve-founder: false
display-title: false
# // Periodically check if you received new messages and display a notification box if you get them
check-tp: true
manual-warning: false
summary-mode: false
automatic-reports: false
# // HAN
han-html: false
han-display-user-talk: true
han-display-bots: false
han-display-user: true
watchlist: "preferences"
# // Whether edits made by same user should be grouped up together in page
automatically-group: false
queue-id: "default"
# // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page.
page-empty-queue: ""
enable-max-score: false
max-score: 0
enable-min-score: false
min-score: 0
automatic-refresh: true
automatically-watchlist-warned-users: false
shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0"
show-warning-if-not-on-last-revision: true
number-dropdown-menu-items: true
insert-edits-of-rolled-user-to-queue: true
# // If true you will not warn users who received a warning recently
confirm-on-recent-warning: false
# // If warning was sent less than N seconds ago it's considered too recent
recent-warning-time-span: 120
confirm-warning-on-very-old-edits: false
# // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent)
skip-warning-on-confirm: false
queues:
"User defined queue #9":
filter-ignored: "exclude"
filter-bots: "exclude"
filter-assisted: "exclude"
filter-ip: "ignore"
filter-minor: "ignore"
filter-new-pages: "ignore"
filter-me: "exclude"
nsfilter-user: "ignore"
filter-talk: "exclude"
filter-watched: "ignore"
filter-reverts: "ignore"
ignored-tags: ""
required-tags: ""
ignored-categories: ""
required-categories: ""
4fehk6bqgkamotn0us302fqtd6wssp1
747804
747803
2026-06-21T10:12:53Z
Petrb
15387
Updating the user configuration page... HG (3.4.14)
747804
javascript
text/javascript
---
# // This is a configuration of huggle, do not change it unless you know what you are doing.
enable: true
# // Last version of huggle that wrote into this configuration file (sanity check)
version: "3.4.14 build: 4321 4cd5e2c8"
report-summary: ""
confirm-multiple: false
confirm-talk: true
confirm-self-revert: true
confirm-whitelist: true
# // This option will change the behaviour of automatic resolution, be careful
revert-on-multiple-edits: true
automatically-resolve-conflicts: true
software-rollback: false
enforce-months-as-headers: true
history-load: true
on-next: 1
delete-edits-after-revert: true
skip-to-last-edit: false
preferred-provider: 2
remove-oldest-queue-edits: false
truncate-edits: false
talkpage-freshness: 20
remove-after-trusted-edit: true
# // Get original creator of every page so that you can G7 instead of reverting the page
retrieve-founder: false
display-title: false
# // Periodically check if you received new messages and display a notification box if you get them
check-tp: true
manual-warning: false
summary-mode: false
automatic-reports: false
# // HAN
han-html: false
han-display-user-talk: true
han-display-bots: false
han-display-user: true
watchlist: "preferences"
# // Whether edits made by same user should be grouped up together in page
automatically-group: false
queue-id: "default"
# // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page.
page-empty-queue: ""
enable-max-score: false
max-score: 0
enable-min-score: false
min-score: 0
automatic-refresh: true
automatically-watchlist-warned-users: false
shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0"
show-warning-if-not-on-last-revision: true
number-dropdown-menu-items: true
insert-edits-of-rolled-user-to-queue: true
# // If true you will not warn users who received a warning recently
confirm-on-recent-warning: false
# // If warning was sent less than N seconds ago it's considered too recent
recent-warning-time-span: 120
confirm-warning-on-very-old-edits: false
# // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent)
skip-warning-on-confirm: false
queues:
"User defined queue #9":
filter-ignored: "exclude"
filter-bots: "exclude"
filter-assisted: "exclude"
filter-ip: "ignore"
filter-minor: "ignore"
filter-new-pages: "ignore"
filter-me: "exclude"
nsfilter-user: "ignore"
filter-talk: "exclude"
filter-watched: "ignore"
filter-reverts: "ignore"
ignored-tags: ""
required-tags: ""
ignored-categories: ""
required-categories: ""
0sjyny19ji8o8m38utd90gvjtembmw2
747805
747804
2026-06-21T10:34:08Z
Petrb
15387
Updating the user configuration page... HG (3.4.14)
747805
javascript
text/javascript
---
# // This is a configuration of huggle, do not change it unless you know what you are doing.
enable: true
# // Last version of huggle that wrote into this configuration file (sanity check)
version: "3.4.14 build: 4373 3.4.14-57-ge3abc7b1"
report-summary: ""
confirm-multiple: false
confirm-talk: true
confirm-self-revert: true
confirm-whitelist: true
# // This option will change the behaviour of automatic resolution, be careful
revert-on-multiple-edits: true
automatically-resolve-conflicts: true
software-rollback: false
enforce-months-as-headers: true
history-load: true
on-next: 1
delete-edits-after-revert: true
skip-to-last-edit: false
preferred-provider: 2
remove-oldest-queue-edits: false
truncate-edits: false
talkpage-freshness: 20
remove-after-trusted-edit: true
# // Get original creator of every page so that you can G7 instead of reverting the page
retrieve-founder: false
display-title: false
# // Periodically check if you received new messages and display a notification box if you get them
check-tp: true
manual-warning: false
summary-mode: false
automatic-reports: false
# // HAN
han-html: false
han-display-user-talk: true
han-display-bots: false
han-display-user: true
watchlist: "preferences"
# // Whether edits made by same user should be grouped up together in page
automatically-group: false
queue-id: "default"
# // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page.
page-empty-queue: ""
enable-max-score: false
max-score: 0
enable-min-score: false
min-score: 0
automatic-refresh: true
automatically-watchlist-warned-users: false
shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0"
show-warning-if-not-on-last-revision: true
number-dropdown-menu-items: true
insert-edits-of-rolled-user-to-queue: true
# // If true you will not warn users who received a warning recently
confirm-on-recent-warning: false
# // If warning was sent less than N seconds ago it's considered too recent
recent-warning-time-span: 120
confirm-warning-on-very-old-edits: false
# // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent)
skip-warning-on-confirm: false
queues:
"User defined queue #9":
filter-ignored: "exclude"
filter-bots: "exclude"
filter-assisted: "exclude"
filter-ip: "ignore"
filter-minor: "ignore"
filter-new-pages: "ignore"
filter-me: "exclude"
nsfilter-user: "ignore"
filter-talk: "exclude"
filter-watched: "ignore"
filter-reverts: "ignore"
ignored-tags: ""
required-tags: ""
ignored-categories: ""
required-categories: ""
4fehk6bqgkamotn0us302fqtd6wssp1
Wikipedia:Sandbox
4
107092
747754
747653
2026-06-20T21:00:50Z
Cewbot
33876
Clear the sandbox. If you want to keep it longer, please test it in [[Special:MyPage/Sandbox|personal sandbox]], you can also check the revision history of the sandbox.
747754
wikitext
text/x-wiki
<noinclude>{{Sandbox}}</noinclude>
== Please start your testing below this line ==
9v37rcaxoiwjar8n3q9n7dcsjdvcyin
Neon
0
119403
747794
470368
2026-06-20T22:34:44Z
97104-Test
74540
747794
wikitext
text/x-wiki
''Neon'' is a chemical element with symbol Ne and atomic number Ne in period 2. It appears as a colorless gas exhibiting an orange-red glow when placed in a high voltage electric field. It is a Gas
==Chemical properties==
Neon has an atomic mass of 20.17976, a boiling point of 27.104, a density of 0.9002, a melting point of 24.56, a molar heat of None, an electron configuration of lorem, and an electron affinity of ipsum.
[[Category:Chemical elements]]
95b6f4mfwh84tu6hcuqkmq0gk8vu12j
Ununennium
0
119510
747691
620588
2026-06-20T14:48:40Z
97104-Test
74540
747691
wikitext
text/x-wiki
''Ununennium'' is a [[chemical element]] with symbol Uue and atomic number Uue in period 8. It appears as a None. It is a Solid
==Chemical properties==
Ununennium has an atomic mass of 315, a boiling point of 630, a density of 3, a melting of elelelelelelelium, a molar heat of None, an electron configuration of 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 4f14 5s2 5p6 5d10 5f14 6s2 6p6 6d10 7s2 7p6 8s1, and an electron affinity of 63.87.
[[Category:Chemical elements]]
t9x5rqk3zq386zigqeju64bo1n60go5
747793
747691
2026-06-20T22:33:53Z
97104-Test
74540
Undid revision [[Special:Diff/747691|747691]] by [[Special:Contributions/97104-Test|97104-Test]] ([[User talk:97104-Test|talk]])
747793
wikitext
text/x-wiki
''Ununennium'' is a [[chemical element]] with symbol Uue and atomic number Uue in period 8. It appears as a None. It is a Solid
==Chemical properties==
Ununennium has an atomic mass of 315, a boiling point of 630, a density of 3, a melting point of None, a molar heat of None, an electron configuration of 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 4f14 5s2 5p6 5d10 5f14 6s2 6p6 6d10 7s2 7p6 8s1, and an electron affinity of 63.87.
[[Category:Chemical elements]]
fhd4wqdyme03ubzleu05l0ltskc4fr1
Wikipedia:Village pump/topic list
4
146208
747798
747294
2026-06-20T23:53:02Z
Cewbot
33876
[[User:Cewbot/log/20170915/configuration|Generate topic list: 9 topics]]
747798
wikitext
text/x-wiki
<!-- This page is auto-generated by bot. Please contact the bot operator to improve the tool. -->
{| class="wikitable sortable mw-collapsible" style="float:left;"
|-
! data-sort-type="number" style="font-weight: normal;" | <small>#</small> !! 💭 Title !! <span title="Count of comments">💬</span> !! <span title="Count of peoples in discussion">👥</span> !! 🙋 Last editor !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span>
|-
| style="text-align: right;" | 1
| [[Wikipedia:Village pump#Script|Script]]
| style="text-align: right;" | 8
| style="text-align: right;" | 5
| style="background-color: #bbb;" | [[User:LuniZunie|LuniZunie]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-11-09T16:47:00.000Z" | 2025-11-09 <span style="color: blue;">16:47</span>
|-
| style="text-align: right;" | 2
| [[Wikipedia:Village pump#Report_concerning_Tanbiruzzammn|Report concerning Tanbiruzzammn]]
| style="text-align: right;" | 2
| style="text-align: right;" | 2
| style="background-color: #bbb;" | [[User:Barras|Barras]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-12-09T21:45:00.000Z" | 2025-12-09 <span style="color: blue;">21:45</span>
|-
| style="text-align: right;" | 3
| [[Wikipedia:Village pump#Report_concerning_Bucheon|Report concerning Bucheon]]
| style="text-align: right;background-color: #fcc;" | 1
| style="text-align: right;background-color: #fcc;" | 1
| style="background-color: #bbb;" | [[User:PieWriter|PieWriter]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-02-19T10:25:00.000Z" | 2026-02-19 <span style="color: blue;">10:25</span>
|-
| style="text-align: right;" | 4
| [[Wikipedia:Village pump#Versions_and_dates|Versions and dates]]
| style="text-align: right;" | 2
| style="text-align: right;background-color: #fcc;" | 1
| style="background-color: #bbb;" | [[Special:Contributions/~2026-13668-13|<span style="color: #c20;">~2026-13668-13</span>]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-03T06:17:00.000Z" | 2026-03-03 <span style="color: blue;">06:17</span>
|-
| style="text-align: right;" | 5
| style="max-width: 24em" | <small>[[Wikipedia:Village pump#Upcoming_Wikimedia_Café_meetup_regarding_the_the_2026-2027_Wikimedia_Foundation_Annual_Plan|Upcoming Wikimedia Café meetup regarding the the 2026-2027 Wikimedia Foundation Annual Plan]]</small>
| style="text-align: right;background-color: #fcc;" | 1
| style="text-align: right;background-color: #fcc;" | 1
| style="background-color: #bbb;" | [[User:Pine|Pine]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-30T03:46:00.000Z" | 2026-03-30 <span style="color: blue;">03:46</span>
|-
| style="text-align: right;" | 6
| [[Wikipedia:Village pump#Changes_to_electionadmin_userright|Changes to electionadmin userright]]
| style="text-align: right;" | 4
| style="text-align: right;" | 4
| style="background-color: #bbb;" | [[User:Chaotic Enby|Chaotic Enby]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-04-23T15:22:00.000Z" | 2026-04-23 <span style="color: blue;">15:22</span>
|-
| style="text-align: right;" | 7
| style="max-width: 24em" | <small>[[Wikipedia:Village pump#Report_concerning_Princebarackalibarrydaddyobamaiii|Report concerning Princebarackalibarrydaddyobamaiii]]</small>
| style="text-align: right;background-color: #fcc;" | 1
| style="text-align: right;background-color: #fcc;" | 1
| style="background-color: #bbb;" | [[User:MathXplore|MathXplore]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-18T12:23:00.000Z" | 2026-05-18 <span style="color: blue;">12:23</span>
|-
| style="text-align: right;" | 8
| style="max-width: 24em" | <small>[[Wikipedia:Village pump#May_2026_Wikimedia_Café_meetups_regarding_the_Wikimedia_Foundation_Annual_Plan|May 2026 Wikimedia Café meetups regarding the Wikimedia Foundation Annual Plan]]</small>
| style="text-align: right;background-color: #fcc;" | 1
| style="text-align: right;background-color: #fcc;" | 1
| style="background-color: #bbb;" | [[User:Pine|Pine]]
| style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-21T19:54:00.000Z" | 2026-05-21 <span style="color: blue;">19:54</span>
|-
| style="text-align: right;" | 9
| style="max-width: 24em" | <small>[[Wikipedia:Village pump#June_2026_Wikimedia_Café_meetups_regarding_the_English_Wikipedia_Editor_Reflections_project|June 2026 Wikimedia Café meetups regarding the English Wikipedia Editor Reflections project]]</small>
| style="text-align: right;background-color: #fcc;" | 1
| style="text-align: right;background-color: #fcc;" | 1
| [[User:Pine|Pine]]
| data-sort-type="isoDate" data-sort-value="2026-06-15T03:56:00.000Z" | 2026-06-15 <span style="color: blue;">03:56</span>
|}
{| class="wikitable mw-collapsible mw-collapsed" style="float: left; margin-left: .5em;;{{#if:{{{no_time_legend|}}}|display:none;|}}"
! title="From the latest bot edit" | Legend
|-
| style="background-color: #efe;" |
* In the last hour
|-
| style="background-color: #eef;" |
* In the last day
|-
| |
* In the last week
|-
| style="background-color: #ddd;" |
* In the last month
|-
| style="background-color: #bbb;" |
* More than one month
|-
! Manual settings
|-
| style="max-width: 12em;" | <small>When exceptions occur,<br />please check [[User:Cewbot/log/20170915/configuration|the setting]] first.</small>
|-
|}
{{Clear}}
j0c8kuhh0899npdrfqlyi30dgw1u9kh
Talk:UInt8.max
1
164563
747795
647301
2026-06-20T22:39:21Z
97104-Test
74540
747795
wikitext
text/x-wiki
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVCL}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{GA nominee|10:57, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Agriculture, food and drink|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module "GetShortDescription".</span></strong>}}
{{GA nominee|10:48, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Art and architecture|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module "GetShortDescription".</span></strong>}}
{{GA}}
t52stawph7j8oyudbimqlq6wvsfaamr
747796
747795
2026-06-20T22:40:00Z
97104-Test
74540
747796
wikitext
text/x-wiki
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVCL}}
{{UCVBVT}}
{{UCVBVT}}
{{UCVBVT}}
{{GA nominee|10:57, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Agriculture, food and drink|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module "GetShortDescription".</span></strong>}}
{{GA nominee|10:48, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Art and architecture|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module "GetShortDescription".</span></strong>}}
{{GA}}
{{FA}}
{{FAC}}
{{FARC}}
j6ywov44ebv3dmgg6yu7kvotg0ark3u
GBU-57A/B MOP
0
166779
747800
721400
2026-06-21T00:06:53Z
InternetArchiveBot
34092
Rescuing 2 sources and tagging 0 as dead.) #IABot (v2.0.9.5
747800
wikitext
text/x-wiki
{{Short description|American GPS-guided "bunker buster" bomb}}
{{Use American English|date=November 2013}}
{{Use dmy dates|date=June 2025}}
{{Infobox weapon
| name = GBU-57A/B Massive Ordnance Penetrator
| image = USAF MOP test release crop.jpg
| caption = GBU-57 MOP prototype
| origin = United States
| type = [[Bunker buster]]
<!-- Type selection -->| is_ranged =
| is_bladed =
| is_explosive = yes
| is_artillery =
| is_vehicle =
| is_missile =
| is_UK = <!-- Service history -->
| service = 2011–present<ref name="Capaccio 2013">{{Cite news |last=Capaccio |first=Tony |date=15 January 2013 |title=Boeing's 30,000-pound bunker-buster bomb improved, Pentagon says |url=https://www.seattletimes.com/business/boeingrsquos-30000-pound-bunker-buster-bomb-improved-pentagon-says/ |access-date=22 June 2025 |work=Seattle Times |location=Seattle, Washington}}</ref>
| used_by = [[United States Air Force]]
| wars = [[Iran–Israel war]]
<!-- Production history -->| designer =
| design_date =
| manufacturer = [[Boeing]]<ref name="Entous & Barnes 2012" />
| unit_cost =
| production_date =
| number = at least 20<ref name="Scully 2025">{{Cite news |last=Scully |first=Rachel |date=17 June 2025 |title=What is a 'bunker buster' bomb? |url=https://www.thehill.com/policy/defense/5355443-trump-decision-bunker-busters-iran/ |access-date=22 June 2025 |work=[[The Hill (newspaper)|The Hill]] |quote=As of 2015, Boeing had delivered at least 20 of the bombs. While the exact size of the MOP stockpile is not known, it's understood to be relatively small. |archive-date=28 June 2025 |archive-url=https://web.archive.org/web/20250628025209/https://thehill.com/policy/defense/5355443-trump-decision-bunker-busters-iran/ |url-status=dead }}</ref>
| variants = <!-- General
| Munitions dropped =
specifications -->
| spec_label =
| weight = {{cvt|27125|lb}}<ref name="Parken 2023" />
| length = {{cvt|20.5|ft|m}}<ref name="DTRA 2007">{{Cite web |last=<!--not stated--> |date=July 2007 |title=DTRA Fact Sheets |url=http://www.dtra.mil/newsservices/fact_sheets/display.cfm?fs=mop |archive-url=https://web.archive.org/web/20090223084920/http://www.dtra.mil/newsservices/fact_sheets/display.cfm?fs=mop |archive-date=23 February 2009 |access-date=17 June 2025 |publisher=[[Defense Threat Reduction Agency]] |location=Fort Belvoir, Virginia}}</ref>
| width =
| height =
| diameter = {{cvt|31.5|in|m|2}}<ref name="DTRA 2007"/>
| crew =
| passengers = <!-- Ranged weapon specifications -->
| cartridge =
| cartridge_weight =
| caliber =
| barrels =
| action =
| rate =
| velocity =
| range =
| max_range =
| feed =
| sights = <!-- Artillery specifications -->
| breech =
| recoil =
| carriage =
| elevation =
| traverse = <!-- Bladed weapon specifications -->
| blade_type =
| hilt_type =
| sheath_type =
| head_type =
| haft_type = <!-- Explosive specifications -->
| filling = AFX-757/PBXN-114
| filling_weight = {{cvt|4590|/|752|lb}}<ref name="Parken 2023">{{Cite news |title=Our Best Look Yet At The Massive Ordnance Penetrator Bunker Buster Bomb |url=https://www.twz.com/our-best-look-yet-at-the-massive-ordnance-penetrator-bunker-buster-bomb | work=[[Popular Science]] |last=Parken |first=Oliver |date=3 May 2023 }}</ref>
| detonation =
| yield = <!-- Vehicle/missile specifications -->
| armour =
| primary_armament =
| secondary_armament =
| engine =
| engine_power =
| pw_ratio =
| transmission =
| payload_capacity =
| suspension =
| clearance =
| fuel_capacity =
| vehicle_range =
| speed =
| guidance =
| steering = <!-- Missiles only -->
| wingspan =
| propellant =
| ceiling =
| altitude =
| depth =
| boost =
| accuracy =
| launch_platform =
| transport =
}}
The '''GBU-57 series MOP''' ('''Massive Ordnance Penetrator''') is a {{convert|30000|lb|kg|adj=on}} class, {{convert|20.5|ft|4=-long|adj=mid}} [[precision-guided munition]] "[[bunker buster]]" bomb developed by [[Boeing]] for the [[United States Air Force]] (USAF).<ref name="Parken 2023" /> Composed of a BLU-127 bomb body and an integrated [[GPS/INS]] guidance package, there are seven GBU-57 variants.<ref name="Parken 2023" /> Due to its size and weight, the GBU-57 MOP can only be carried by the [[Northrop B-2 Spirit]] [[strategic bomber]],<ref name="end">{{Cite news |last=Dolzikova |first=Darya |last2=Savill |first2=Matthew |date=1 October 2024 |title=Iran vs. Israel redux: The enormous difficulties and ramifications if Israel attacks Iran's nuclear sites |url=https://thebulletin.org/2024/10/iran-vs-israel-redux-the-enormous-difficulties-and-ramifications-if-israel-attacks-irans-nuclear-sites/ |work=[[Bulletin of the Atomic Scientists]]}}</ref><ref name="cnn_mop">{{Cite news |last=Britzky |first=Haley |last2=Robinson |first2=Lou |date=18 June 2025 |title=Israel has pushed the US to use its 'bunker buster' bomb on Iran. Here's what the weapon can do |url=https://edition.cnn.com/2025/06/18/politics/bunker-buster-weapon-explained-dg |access-date=22 June 2025 |work=[[CNN]]}}</ref> although initial tests were conducted with the [[Boeing B-52 Stratofortress]].<ref name="NDTV2025" /><ref name="ASFM2025" />
The first combat use of the GBU-57 MOP came on 22 June 2025, when seven Northrop B-2 Spirit stealth bombers [[Operation Midnight Hammer|dropped]] a total of fourteen GBU-57 bombs on Iran's [[Fordow Uranium Enrichment Plant]] and [[Natanz Nuclear Facility]].
The bomb is much larger than earlier USAF [[bunker buster]]s such as the {{convert|5000|lb|kg|adj=on|-2}} [[GBU-28]] and [[GBU-37 GPS-Aided Munition|GBU-37]].<ref name="factsheet" />
==Development and production==
Bunker-busting bombs were used in the [[2003 invasion of Iraq]], but failed to penetrate deeply or achieve the desired destruction. This renewed interest in a larger bunker buster, so the [[Defense Threat Reduction Agency]] (DTRA) launched the MOP project.<ref name="factsheet">{{Cite web |date=18 November 2011 |title=Massive Ordnance Penetrator fact sheet |url=https://www.af.mil/About-Us/Fact-Sheets/Display/Article/104614/massive-ordnance-penetrator/ |access-date=22 June 2025 |website=Air Force |publisher=US Air Force}}</ref>
In July 2004, USAF asked defense contractors how they might develop a 30,000-pound, precision-guided bomb that could destroy targets deep underground, in caves, or in hardened bunkers.<ref>{{Cite news | url=https://edition.cnn.com/2004/US/07/20/big.bomb/ | title='Bunker busters' may grow to 30,000 pounds | first= Barbara | last=Starr | work=[[CNN]] | date=July 20, 2004}}</ref>
The USAF developed a concept for a collection of very large penetrator and blast weapons: the so-called "Big BLU" (Bomb Live Unit) collection, which includes the [[GBU-43/B MOAB]] (Massive Ordnance Air Blast) and the GBU-57 MOP. The MOP was developed by the [[Air Force Research Laboratory]] Munitions Directorate at [[Eglin Air Force Base]], and designed by [[Boeing]] to be used with the [[Northrop B-2 Spirit|B-2 Spirit]]<ref name="2025-GS-MOP" /><ref>{{Cite web |date=18 January 2007 |title=Military & Aerospace Electronics, "Air Force ready to deploy 30,000-pound 'super bomb' on stealthy B-2 jet" |url=https://www.militaryaerospace.com/home/article/16724828/air-force-ready-to-deploy-30000-pound-super-bomb-on-stealthy-b-2-jet-bomber |access-date=22 June 2025}}</ref> and the [[Northrop Grumman B-21 Raider|B-21 Raider]].<ref>{{Cite web |last=Suciu |first=Peter |date=19 May 2021 |title=BANG: The B-21 Raider Is Just Short of Unstoppable |url=https://nationalinterest.org/blog/reboot/bang-b-21-raider-just-short-unstoppable-185558 |access-date=22 June 2025 |website=The National Interest}}</ref>
In March 2007, the MOP was tested in a DTRA tunnel at the [[White Sands Missile Range]] in New Mexico. In July 2007, Northrop Grumman received a $2.5 million contract to refit the USAF's B-2s, enabling the aircraft to carry two 14-ton MOPs.<ref name=deagel>{{Cite news |last=<!--not stated--> |date=19 July 2007 |title=Northrop-Grumman to Equip B-2 Bomber with Massive Ordnance Penetrator |url=https://deagel.com/news/n000002435 |access-date=22 June 2025 |agency=Prime Newswire}}</ref> Beginning in 2008, the MOP was tested under various conditions, including on [[rocket sled]]s at [[Holloman High Speed Test Track]] and from [[Boeing B-52 Stratofortress|B-52]] and [[Northrop B-2 Spirit|B-2]] [[strategic bomber]] aircraft at White Sands.<ref name="NDTV2025">{{Cite news |last=<!--not stated--> |date=17 June 2025 |title=Israel Seeks US' Bunker Buster - 14,000 Kg Bomb, To Hit Iran's Nuclear Sites |url=https://www.ndtv.com/world-news/israel-seeks-us-bunker-buster-14-000-kg-bomb-to-hit-irans-nuclear-sites-8691511 |access-date=22 June 2025 |work=NDTV World Desk |publisher=[[NDTV|New Delhi Television Ltd]] |location=New Delhi}}</ref><ref name="ASFM2025">{{Cite magazine |last=<!--not stated--> |date=2025 |title=GBU-57 MOP |url=https://www.airandspaceforces.com/weapons-platforms/gbu-57-mop/ |access-date=22 June 2025 |magazine=Air & Space Forces Magazine |publisher=Air & Space Forces Association |location=Arlington, Virginia}}</ref>
In October 2009, the Pentagon had obtained permission from Congress to shift funding to accelerate the project.<ref>{{Cite news |date=October 6, 2009 |title=Is the U.S. Preparing to Bomb Iran? |url=https://abcnews.go.com/Politics/us-preparing-bomb-iran/story?id=8765343 |work=[[ABC News (United States)|ABC News]]}}</ref><ref>{{Cite web |title=Reprogramming action – prior approval |url=https://abcnews.go.com/images/Politics/reprogramming_memo_091006.pdf |access-date=22 June 2025 |website=[[ABC News (United States)|ABC News]]}}</ref> Funding delays and test-schedule changes meant the bomb would not be deployable until December 2010, six months later than planned.<ref>{{Cite news |last=Wolf |first=Jim |date=18 December 2009 |title=Pentagon delays new "bunker buster" bomb |url=https://www.reuters.com/article/idUSTRE5BH5IQ20091218 |work=Reuters}}</ref>
In February 2011, Boeing received a $15 million contract for modification and increased testing.<ref>{{Cite news | url=https://www.militaryaerospace.com/defense-executive/article/16717447/boeing-steps-up-testing-of-massive-ordnance-penetrator-mop-30000-pound-bunker-busting-super-bomb | title=Boeing steps-up testing of Massive Ordnance Penetrator (MOP) 30,000-pound bunker-busting super bomb | work=Military Aerospace | date=February 9, 2011}}</ref> In April 2011, the USAF ordered eight MOPs plus supporting equipment for $28 million.<ref>Reed, John. [https://web.archive.org/web/20110413164651/http://www.dodbuzz.com/2011/04/08/usaf-getting-more-penetrating-power/ "USAF Getting More Penetrating Power."] ''DoD Buzz'', 8 April 2011.</ref> The USAF began receiving the MOP in September 2011. In February 2012, Congress approved $81.6 million to further develop and improve the weapon.<ref name="Capaccio 2013"/> In March 2012, there was an "operational stockpile" at [[Whiteman Air Force Base]].<ref>Thompson, Mark. [https://nation.time.com/2012/03/09/key-point-bunker-busters-come-in-both-small-and-large-sizes/ "Key Point: Bunker-Busters Come In Both Small and Large Sizes"] {{Webarchive|url=https://web.archive.org/web/20250619163912/https://nation.time.com/2012/03/09/key-point-bunker-busters-come-in-both-small-and-large-sizes/ |date=19 June 2025 }}. ''Time''. 9 March 2012.</ref> In 2012, the Pentagon requested $82 million to develop greater penetration power for the existing weapon.<ref name="Entous & Barnes 2012">{{Cite news |last=Entous |first=Adam |last2=Barnes |first2=Julian E. |date=28 January 2012 |title=Pentagon Seeks Mightier Bomb vs. Iran |url=https://www.wsj.com/articles/SB10001424052970203363504577187420287098692 |access-date=22 June 2025 |publisher=[[The Wall Street Journal]]}}</ref> By early 2013, the MOP had been successfully integrated onto the B-2 Spirit.<ref name="Butler2013">{{Cite magazine |last=Butler |first=Amy |date=15 February 2013 |title=Northrop, USAF Explore Diverse B-2 Weapons Options |url=http://www.aviationweek.com/Article.aspx?id=/article-xml/asd_02_15_2013_p04-02-549066.xml |url-status=dead |archive-url=https://web.archive.org/web/20130510074705/http://www.aviationweek.com/Article.aspx?id=/article-xml/asd_02_15_2013_p04-02-549066.xml |archive-date=10 May 2013 |access-date=22 June 2025 |magazine=[[Aviation Week & Space Technology]]}}</ref>
At least 20 of the bombs were built and delivered to the USAF by November 2015.<ref>{{Cite news |last=Uchimiya |first=Ellen |date=June 21, 2025 |title=What to know about the MOP and the B-2, the bunker-buster bomb and plane that could be used to strike Iran |url=https://www.cbsnews.com/news/massive-ordnance-penetrator-bomb-gbu-57-b-2-bomber-iran-fordo-nuclear-facility/ |work=[[CBS News]]}}</ref> In April 2019, Boeing received a $21 million contract modification for production of more bombs.<ref>{{Cite news | url=https://www.defenseindustrydaily.com/mopping-up-the-usas-30000-pound-bomb-03172/ | title=MOPping Up: The USA’s 30,000 Pound GBU-57 Bomb | work=Defense Industry Daily | date=April 16, 2019}}</ref> In October 2019, the USAF awarded $90 million in contracts for the production of an unspecified number of case assemblies for the BLU-127C/B warhead to be used in the bomb.<ref name=updates>{{Cite news |title=Air Force Updates Massive Ordnance Penetrator Bombs Amid New Iranian Nuclear Posturing |url=https://www.twz.com/30872/air-force-updates-massive-ordnance-penetrator-bombs-amid-new-iranian-nuclear-posturing | work=[[Popular Science]] |date=13 November 2019}}</ref>
==Key components==
The GBU-57 uses a BLU-127 series bomb as the explosive component. The BLU-127 series bombs feature modular design that allows for incremental improvements and future upgrades.<ref name="Parken 2023" /><ref>{{Cite web |title=Boeing GBU-57/B MOP |url=https://www.designation-systems.net/dusrm/app5/mop.html |access-date=22 June 2025 |website=www.designation-systems.net}}</ref> One variant of the BLU-127 bomb body contains {{convert|4590|lb|0}} of AFX-757 and {{convert|752|lb|0}} of PBXN-114, a [[polymer-bonded explosive]] (PBX), for a total explosive payload of {{convert|5342|lb|0}}. The PBX is optimized for controlled detonation in confined spaces. The bomb's casing is made from high-density [[Eglin steel]] alloy, engineered to survive the extreme stresses of deep penetration before detonation.<ref name="Parken 2023"/><ref name="debuglies">{{Cite web |last=admin |date=7 February 2025 |title=The Evolution and Strategic Imperative of the GBU-57/B Massive Ordnance Penetrator in Modern Warfare |url=https://debuglies.com/2025/02/07/the-evolution-and-strategic-imperative-of-the-gbu-57-b-massive-ordnance-penetrator-in-modern-warfare/ |access-date=22 June 2025 |website=debuglies.com |language=it-IT}}</ref><ref>{{Cite web |date=28 December 2012 |title=Massive Ordnance Penetrator |url=https://www.dote.osd.mil/Portals/97/pub/reports/FY2012/af/2012mop.pdf |website=www.dote.osd.mil |publisher=Air Force Programs}}</ref>
The GBU-57 is a [[precision-guided munition]] equipped with an integrated [[GPS/INS]] guidance package, and therefore does not require the addition of a [[Joint Direct Attack Munition]] guidance package. This integrated system enables the bomb to strike within meters of its intended target.<ref>{{Cite web |last=AirPra |date=30 September 2023 |title=Know The Best Of The GBU-57 Massive Ordnance Penetrator |url=https://airpra.com/know-the-best-of-the-gbu-57-massive-ordnance-penetrator/ |access-date=22 June 2025}}</ref> Detonation timing is managed by the Large Penetrator Smart Fuze (LPSF), which adjusts the moment of explosion based on impact depth and the characteristics of the underground structure.<ref name="debuglies" />
In flight, the bomb is stabilized by [[grid fin]]s, which help maintain trajectory and allow for mid-course adjustments.<ref name="globalsecurity">{{Cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://aviationweek.com/?id=/article-xml/AW_09_17_2012_p56-492712.xml |access-date=22 June 2025 |website=www.globalsecurity.org}}</ref> The GBU-57 uses grid fins as opposed to the [[Fin|planar fins]] found on most conventional bombs due to their greater control at the high [[Mach number|mach]] flight regimes the bomb operates under, as well as their ability to fold for storage in a [[Northrop B-2 Spirit|B-2]]'s [[Bomb bay|bomb bays]]. As grid fins have higher drag than planar fins at any given mach number, their size is usually decreased to compensate while maintaining maneuverability.
==Combat use==
===US airstrikes on Iranian nuclear facilities===
There has been significant debate over whether the GBU-57 Massive Ordnance Penetrator (MOP) can reliably destroy Iran’s deeply buried nuclear sites at Natanz and Fordow. The Fordow facility and the new halls under construction at Natanz are thought to lie more than 80 m underground, whereas the original Natanz enrichment plant sits roughly 20 m below the surface.<ref>{{cite web |title=America’s huge bunker-busting bomb is not sure to work in Iran |url=https://www.economist.com/graphic-detail/2025/06/18/americas-huge-bunker-busting-bomb-is-not-sure-to-work-in-iran}}</ref>
The MOP is reportedly able to penetrate through about 18 m of reinforced concrete with a compressive strength of 5,000 psi.<ref name="2025-BBC-Fordo">{{Cite web |last=BBC Verify and the Visual Journalism team |date=18 June 2025 |title=Iran's secretive nuclear site that only a US bomb could hit |url=https://www.bbc.co.uk/news/resources/idt-868e3c3d-25ec-43cb-bcc0-8832464b91ca |archive-url=https://web.archive.org/web/20250620075543/https://www.bbc.co.uk/news/resources/idt-868e3c3d-25ec-43cb-bcc0-8832464b91ca |archive-date=2025-06-20 |access-date=22 June 2025 |website=BBC News |publisher=BBC |quote="The MOP’s heavy casing and weight allows it to penetrate about 18m of concrete or 61m of earth before exploding, according to analysts at Janes"}}</ref><ref>{{cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://www.globalsecurity.org/military/systems/munitions/mop.htm}}</ref> Iranian domestic research has produced concrete exceeding 30,000 psi, a level that could sharply reduce the bomb’s effective penetration depth.<ref>{{cite web |title=America’s huge bunker-busting bomb is not sure to work in Iran |url=https://www.economist.com/graphic-detail/2025/06/18/americas-huge-bunker-busting-bomb-is-not-sure-to-work-in-iran}}</ref> Complicating matters further is the possibility of deflection or yaw caused by advanced bunker-shell construction techniques.<ref>{{cite web |title=BUNKER BUSTER BOMB Myth / MIT Prof Ted Postol & Lt Col Daniel Davis |url=https://www.youtube.com/watch?v=TriASB-F5UY}}</ref>
The first combat use of the GBU-57 MOP was during the [[United States strikes on Iranian nuclear sites]] on 22 June 2025,<ref name="NYT20250622">{{Cite web |last=Cooper |first=Helene |date=21 June 2025 |title=U.S. Military Is Pulled Back Into Middle East Wars |url=https://www.nytimes.com/2025/06/21/us/politics/military-middle-east-wars.html |access-date=22 June 2025 |website=[[The New York Times]] |quote=The attack was the first time the U.S. military had used the weapon in combat.}}</ref><ref>{{Cite news |last=Allison |first=George |date=22 June 2025 |title=B-2 stealth bombers strike Iran's nuclear facilities |url=https://ukdefencejournal.org.uk/b-2-stealth-bombers-strike-irans-nuclear-facilities/ |access-date=22 June 2025 |work=UK Defence Journal}}</ref> when seven [[Northrop B-2 Spirit]] [[Stealth Bombers|stealth bombers]] dropped a total of fourteen GBU-57 bombs, twelve on the [[Fordow Uranium Enrichment Plant]] and two on the [[Natanz Nuclear Facility]].<ref name="Mongilio 2025">{{Cite news |last=Mongilio |first=Heather |last2=Lagrone |first2=Sam |date=22 June 2025 |title=Operation Midnight Hammer Drops 14 Bunker Busters in Record B-2 Strike Against Iranian Nuclear Sites |url=https://news.usni.org/2025/06/21/u-s-strikes-3-iranian-nuclear-sites-using-b-2s-sub-launched-tomahawks |access-date=22 June 2025 |work=USNI News |publisher=U.S. Naval Institute |location=Annapolis, Maryland}}</ref><ref>{{Cite web |title=U.S. Bombs Iran Live Updates: Trump Says Iran's Nuclear Sites "Completely and Totally Obliterated" in Speech |url=https://www.wsj.com/livecoverage/iran-israel-conflict-latest-news |access-date=2025-06-22 |website=WSJ |language=en-US}}</ref>
According to [[Dan Caine|General Dan Caine]], Chairman of the [[Joint Chiefs of Staff|U.S Joint Chiefs of Staff]], both sites sustained severe damage.<ref>{{Cite web |title=Bombing Inflicted Severe Damage, Pentagon Says |url=https://www.wsj.com/livecoverage/iran-israel-conflict-latest-news/card/bombing-inflicted-severe-damage-pentagon-says-xe3Zg4JYmAfTXLwad7tJ |access-date=2025-06-22 |website=WSJ |language=en-US}}</ref> Darya Dolzikova, Senior Research Fellow at [[RUSI]], argues that the exact damage to the facilities is unclear.<ref>{{cite web |title=RUSI Experts React to US Strikes on Iran's Nuclear Facilities |url=https://www.rusi.org/explore-our-research/publications/commentary/rusi-experts-react-us-strikes-irans-nuclear-facilities}}</ref> Rafael Grossi, director general in [[IAEA]] said “no one, including the IAEA, is in a position to have fully assessed the underground damage at Fordow”, it is expected to be “very significant”.<ref>{{cite web |title=UN nuclear chief estimates damage to Iran’s facilities ‘very significant’ |url=https://www.aljazeera.com/news/2025/6/23/un-nuclear-chief-estimates-damage-to-irans-facilities-very-significant}}</ref>
CNN reported that the strikes "did not destroy the core components" of the facilities.<ref>{{Cite web |last=Bertrand |first=Natasha |last2=Lillis |first2=Katie Bo |last3=Cohen |first3=Zachary |date=2025-06-24 |title=Exclusive: Early US intel assessment suggests strikes on Iran did not destroy nuclear sites, sources say {{!}} CNN Politics |url=https://www.cnn.com/2025/06/24/politics/intel-assessment-us-strikes-iran-nuclear-sites |access-date=2025-06-24 |website=CNN |language=en}}</ref>
==Specifications and capabilities==
* '''Length''': {{convert|20.5|ft|m|1}}<ref name="DTRA 2007"/>
* '''Diameter''': {{convert|31.5|in|m|1}}<ref name="DTRA 2007"/>
* '''BLU-127 bomb body weight''': {{convert|27125|lb|kg|0}}<ref name="Parken 2023"/>
* '''Explosive weight''': {{convert|5342|lb|0}}<ref name="Parken 2023"/>
** '''AFX-757''': {{convert|4590|lb|0}}<ref name="Parken 2023"/>
** '''PBXN-114''': {{convert|752|lb|0}}<ref name="Parken 2023"/>
* '''Penetration''': (debated) There is debate regarding the penetration capabilities of the bomb. The US Air Force has said that the GBU-57 can penetrate up to {{convert|200|ft|m|abbr=on|sigfig=1}} of unspecified material before exploding.<ref name="milestone">{{Cite web |title=Future 30,000-pound bomb reaches mile stone |url=https://www.acc.af.mil/News/Features/Display/Article/204431/future-30000-pound-bomb-reaches-mile-stone/ |archive-url=https://web.archive.org/web/20231211033254/https://www.acc.af.mil/News/Features/Display/Article/204431/future-30000-pound-bomb-reaches-mile-stone/ |archive-date=11 December 2023 |website=Air Combat Command |access-date=25 June 2025 |url-status=live }}</ref> The BBC reports that analysts at [[Janes Information Services|Janes]] say the weapon can penetrate about {{convert|60|m|ft|abbr=on|order=flip}} of earth or {{convert|18|m|ft|abbr=on|order=flip|-1}} of concrete.<ref name="2025-BBC-Fordo"/> This is consistent with a separate source which suggests penetration of up to {{convert|18|m|ft|abbr=on|order=flip|-1}} into [[Concrete#Properties|reinforced concrete]] with a compressive strength of {{convert|5000|psi|MPa|abbr=on}} and {{convert|8|ft|m|abbr=on}} into {{convert|10000|psi|MPa|abbr=on}} reinforced concrete.<ref name="2025-GS-MOP">{{Cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://www.globalsecurity.org/military/systems/munitions/mop.htm}}</ref>
The MOP does not have a void-sensing fuze and detonates only after it comes to a stop, even if it has passed the target area.<ref>{{Cite web |last=Butler |first=Amy |date=17 September 2012 |title=Curbed Ambitions: Hard targets pose a near-term problem as USAF explores weapon and fuze options |url=https://archive.aviationweek.com/issue/20120917#!&pid=56 |url-access=subscription |website=[[Aviation Week]] |pages=56–58}}</ref>
Operationally, the MOP can be dropped only by the [[B-2 Spirit]], which can carry up to two of the bombs. The [[B-21 Raider]] is slated to carry it.<ref>{{Cite web |last=Atlamazoglou |first=Stavros |date=16 December 2024 |title=The Massive GBU-57A/B MOP Was Built for a War with China |url=https://nationalinterest.org/blog/buzz/massive-gbu-57ab-mop-was-built-war-china-214075 |access-date=22 June 2025 |website=The National Interest}}</ref><ref name="debuglies" /> The [[B-52]] has been used during weapons testing of the MOP, but requires modifications to carry the bomb.<ref name="Parken 2023"/>
==Users==
*{{Flagu|United States}}
**{{Air force|United States|size=23px}} – At least 20 in service as of November 2015.<ref name="Scully 2025"/>
==Gallery==
<gallery widths="250px" heights="250px" >
File:Off loading of MOP cropped.jpg|MOP being offloaded in preparation for its first explosive test, 2007.
File:Inside Tunnel MOP cropped.jpg|MOP underground at [[White Sands Missile Range]] before its first explosive test, 2007.
File:MOP in the B-2 bomb bay.jpg|Mock up of MOP inside a bomb bay of a B-2 simulator, 2007.
File:B-52 releases the MOP during a weapons test.jpg|[[B-52]] releases a MOP during a weapons test, 2009.
</gallery>
== Desarrollo ==
In 2002, [[Northrop Grumman]] and [[Lockheed Martin]] were working on the development of a 30,000-pound (13 600 kg) pump designed to penetrate the ground, named ⁇ ''Big BLU'' ⁇ , in reference to the BLU pump. But due to financial and technical difficulties the development was abandoned. Following the 2003 invasion of Iraq, analysis of sites that had been targeted by anti-bunker bombs revealed poor penetration capacity and insufficient levels of destruction. In view of this, there was renewed interest in the development of a large anti-bunker bomb. The Threat Reduction Defense Agency initiated the MOP project to meet a long-term requirement from the Air Force.<ref name="factsheet"/> 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki>
The Aerial Force of United States did not have any official recognition on the development of a bomb of big size, but prepares conceptually a penetrador massive of ''big'' size and arms of demolition, the called collection «Big Blu», that includes the bomb [[GBU-43/B MOAB|MOAB]] (''Massive Ordnance Air Burst''). The development of the MOP already was under way in the Direction of Ammunitions of the Air Force Research Laboratory, in the [[Eglin Air Force Base|Base of the Aerial Force Eglin]], [[Florida]]. The work of design and the tests also is being made by [[Boeing]]. It pretended that the bomb could be deployed in the [[Northrop B-2 Spirit|bomber B-2]], and be guided by means of [[Global Positioning System|GPS]].<ref>{{Cite web |title=Military & Aerospace Electronics, "Air Force ready to deploy 30,000-pound 'super bomb' on stealthy B-2 jet" |url=http://mae.pennnet.com/display_article/282449/32/NEWS/none/none/Air-Force-ready-to-deploy-30%2C000-pound-%27super-bomb%27-on-stealthy-B-2-jet-bomber/ |archive-url=https://web.archive.org/web/20071001000041/http://mae.pennnet.com/display_article/282449/32/NEWS/none/none/Air-Force-ready-to-deploy-30%2C000-pound-%27super-bomb%27-on-stealthy-B-2-jet-bomber/ |archive-date=1 de octubre de 2007 |access-date=13 de agosto de 2012 |dead-url=yes}}</ref> The control of flight will make by means of [[Grid fin|fins of rejilla]], in place of the conventional. 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki>
On 19 July 2007 [[Northrop Grumman]] announced an agreement of 2,5 million dollars for the reacondicionamiento of the bomber furtivo B-2. Each one of the B-2 of the Aerial Force of United States is able to spend two MOP of 14 metric tonnes each one. 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki>
==See also==
* [[Earthquake bomb]]
* [[Thermobaric weapon]]
;Specific large bombs
* [[BLU-82]] Daisy Cutter bomb
* [[Father of All Bombs]]
* [[Mother of All Bombs|GBU-43/B Mother of All Bombs]], another very large US bomb
* [[Grand Slam (bomb)]]
* [[T-12 Cloudmaker]]
* [[Tallboy (bomb)]]
* [[FAB-9000]]
==References==
{{Reflist}}
==External links==
{{Commons category|Massive Ordnance Penetrator}}
* [https://www.af.mil/About-Us/Fact-Sheets/Display/Article/104614/massive-ordnance-penetrator/ Massive Ordnance Penetrator Fact Sheet]
{{USAF equipment}}
[[Category:Anti-fortification weapons]]
[[Category:Boeing]]
[[Category:Guided bombs of the United States]]
[[Category:Military equipment introduced in the 2010s]]
knzuc44wbx36i2tojsh5jwd52vs0fla
User:Ponor/wAwB-worker.js
2
171632
747801
744514
2026-06-21T03:33:06Z
Ponor
47975
set window.wa_diffPST=true at any time to enable pre-save transform of {{subst:___}} and signatures
747801
javascript
text/javascript
/*
* wAwB – An in-browser application for automated editing of wiki pages.
* Features: customizable regex or JavaScript search-and-replace rules,
* custom JavaScript pre/post-processing functions and function libraries,
* granular protection or targeting of different parts of wikitext,
* a full-fledged CodeMirror editor, and options to move, delete, and protect pages.
* Author: [[User:Ponor]]
* Documentation: [[User:Ponor/wAwB]]
* License: GNU General Public License (GPL)
*/
//<nowiki>
mw.loader.using([
'oojs-ui-core',
'oojs-ui-widgets',
'oojs-ui-windows',
'mediawiki.api',
'mediawiki.diff.styles',
'mediawiki.util',
'mediawiki.page.gallery.styles',
'oojs-ui.styles.icons-content',
'oojs-ui.styles.icons-interactions',
'oojs-ui.styles.icons-movement',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-editing-core',
'oojs-ui.styles.icons-editing-advanced'
]).then(function() {
// =====================================================================
// 1. STATE & CONFIGURATION
// =====================================================================
var SCRIPT_TIMEOUT_MS = window.wa_timeout || 5000;
var FETCH_SAFETY_LIMIT = window.wa_fetchLimit || 10000;
var APP_NAME = "wAwB";
var DO_TAG = false;
var SUMMARY_SUFFIX = window.wa_suffix || " [[:en:User:Ponor/wAwB| #wAwB]]";
var APP_VERSION = "0.6";
var DOC_URL = window.wa_docUrl || "https://en.wikipedia.org/wiki/User:Ponor/wAwB";
document.title = window.wa_editIn || "Edit in wAwB";
var PERMS = {
canSave: false,
allowBot: false,
saveDelay: 0
};
var IS_ADMIN = mw.config.get('wgUserGroups').includes('sysop');
var CAN_MOVE = IS_ADMIN || mw.config.get('wgUserGroups').includes('extendedmover') || mw.config.get('wgUserGroups').includes('filemover') || mw.config.get('wgUserGroups').includes('pagemover');
var WIKI = mw.config.get('wgDBname');
var SAVED_RUN = 0;
var SAVED_SESSION = 0;
var currentPageExists = false;
var isRunning = false;
var isFetching = false;
var currentTitle = null;
var currentVars = {};
var currentLibrary = {
name: null,
code: null
};
var originalWikitext = "";
var currentPageSummaryAppend = "";
var currentPageSummaryOverride = null;
var baseRevId = 0;
var currentViewMode = 'diff';
var autoSaveTimer = null;
var propNamesLoaded = false;
var hasNewSources = false;
var currentHeightMode = 1; // 0=25%, 1=45% (default), 2=72%
var heightValues = ['25%', '45%', '72%'];
// EXTERNAL RULES STATE
var wikiTypos = [];
var localTypos = [];
// LOADING FLAG
var isLoadingProject = false;
// NAMESPACE ALIASES
var nsIds = mw.config.get('wgNamespaceIds');
var catAliases = [],
fileAliases = [];
for (var key in nsIds) {
if (nsIds[key] === 14) catAliases.push(key.replace(/_/g, ' '));
if (nsIds[key] === 6) fileAliases.push(key.replace(/_/g, ' '));
}
catAliases.sort((a, b) => b.length - a.length);
fileAliases.sort((a, b) => b.length - a.length);
var REGEX_CAT_PFX = catAliases.map(mw.util.escapeRegExp).join('|');
var REGEX_FILE_PFX = fileAliases.map(mw.util.escapeRegExp).join('|');
// MASTER PROTECTION DEFINITIONS
var PROTECTION_DEFS = [{
id: 'nowiki',
isOn: true,
label: 'Nowiki: <nowiki>',
regex: /<nowiki>[\s\S]*?<\/nowiki>|<nowiki\s*\/>/gi
},
{
id: 'comments',
isOn: true,
label: 'Comments: <!' + '-- -->',
regex: new RegExp('<!' + '--[\\s\\S]*?--' + '>', 'g')
},
{
id: 'headers',
isOn: false,
label: 'Headers: == Title ==',
regex: /^==+[\s\S]+?==+\s*$/gm
},
{
id: 'templates',
isOn: false,
label: 'Templates: {{...}}',
open: '{{',
close: '}}',
species: null,
regex: null
},
{
id: 'tables',
isOn: false,
label: 'Tables: {|...|}',
open: '\n{|',
close: '\n|}',
regex: null
},
{
id: 'images',
isOn: false,
label: 'Images: [[File:...|...|...]]',
open: '[[',
close: ']]',
species: '(?:' + REGEX_FILE_PFX + ')\\s*:',
regex: null
},
{
id: 'refs',
isOn: true,
label: 'Refs: <ref...',
regex: /<ref[^>]*?\/>|<ref[^>]*?(?<!\/)>[\s\S]*?<\/ref>/gi
},
{
id: 'blocks',
isOn: false,
label: 'Blocks: math, gallery...',
regex: null
},
{
id: 'categories',
isOn: true,
label: 'Categories: [[Category:...]]',
regex: new RegExp('\\[\\[\\s*(' + REGEX_CAT_PFX + ')\\s*:[^\\]]+\\]\\]', 'giu')
},
{
id: 'files',
isOn: true,
label: 'File names: File:...',
regex: new RegExp('(?<=\\[\\[\\s*:?(:?' + REGEX_FILE_PFX + ')\\s*:)[^|\\]]+' + '|^\\s*(?:' + REGEX_FILE_PFX + ')\\s*:([^\\][}{|\\n]{1,150}\\.(?:svg|png|jpe?g|gif|tiff|webp|xcf|mp3|midi|ogg|webm|flac|wav|mpe?g|pdf|djv))', 'gmiu')
},
{
id: 'targets',
isOn: false,
label: 'Targets of [[...|',
regex: /(?<=\[\[:?)[^|\]]+?(?=\||\]\])/g
},
{
id: 'extlinks',
isOn: true,
label: 'External links: [...]',
regex: /(?<=\[)(https?:\/\/|ftps?:\/\/|mailto:)[^\]]+(?=\])/gi
},
{
id: 'urls',
isOn: true,
label: 'URLs: http...',
regex: /https?:\/\/[^\s<>[\]"'`()]+/gi
}
];
// =====================================================================
// 2. CSS STYLES
// =====================================================================
var styles = `
* { box-sizing: border-box; }
#wa-root { font-family: sans-serif; height: 100vh; width: 100vw; overflow: hidden; display: flex; font-size: 14px; }
#wa-left-panel { width: 400px; min-width: 400px; max-width: 400px; background: var(--background-color-base, #fff); border-right: 1px solid #c8ccd1; display: flex; flex-direction: column; z-index: 10; overflow-x: hidden; }
#wa-left-panel h3 { color: #3f6fcf; text-align: center; margin: 12px 0 0 0; }
#wa-username { color: #3f6fcf; text-align: center; margin: 2px 0; font-size: 92%; }
#wa-content-area { flex: 1; padding: 10px 10px 100px 10px; overflow-y: auto; overflow-x: hidden; }
#wa-right-panel { flex: 1; display: flex; flex-direction: column; height: 100%; background: var(--background-color-interactive, #eaecf0); overflow: hidden; }
#wa-visual-output { flex: 0 0 45%; min-height: 0; overflow-y: auto; background: var(--background-color-base, #fff); padding: 20px; border-bottom: 1px solid #c8ccd1; }
.wa-editor-header { flex: 0 0 40px; min-height: 40px; padding: 0 10px; background: var(--background-color-interactive-subtle, #f8f9fa); border-bottom: 1px solid #c8ccd1; display: flex; gap: 25px; justify-content: space-between; align-items: center; z-index: 10; }
.wa-editor-header.wa-dirty { background: var(--background-color-warning-subtle, #fdf2d5); border-bottom: 1px solid #e6a700; }
.wa-header-left { flex: 1; display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; }
.wa-header-right { flex: 0 0 auto; display: flex; justify-content: flex-end; align-items: center; gap: 8px; color: var(--color-placeholder, #72777d); font-size: 0.9em; }
.wa-title-link { font-weight: bold; font-size: 1.1em; color: var(--color-progressive--focus, #36c) !important; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 40%; }
.wa-title-link:hover { text-decoration: underline; }
#wa-status-indicator { flex: 0 0 auto; width: 10px; height: 10px; border-radius: 50%; background-color: #00af89; cursor: help; transition: background-color 0.2s; margin-right: 2px; }
#wa-status-indicator.wa-status-working { background-color: #36c; animation: wa-pulse-blue 1.5s infinite; }
#wa-status-indicator.wa-status-error { background-color: #bf3c2c; }
@keyframes wa-pulse-blue { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } }
.wa-header-sep { border-left: 1px solid #ccc; height: 16px; flex-shrink: 0; margin: 0 2px; }
#wa-summary-preview { flex-grow: 1; color: #d00; font-style: italic; white-space: nowrap; text-overflow: ellipsis; overflow-x: auto; background: transparent; border: none; outline: none; box-shadow: none; min-width: 50px; padding: 2px 5px; scrollbar-width: none; -ms-overflow-style: none; font-size: 1em; }
#wa-summary-preview::-webkit-scrollbar { display: none; }
#wa-summary-preview:hover { background: rgba(0, 0, 0, 0.05); cursor: text; }
#wa-summary-preview:focus { background: #fff; }
.wa-info-container { margin-right: 10px; }
.wa-tools-container { display: flex; align-items: center; gap: 2px; }
.wa-resize-container { display: flex; flex-direction: column; justify-content: center; height: 100%; margin-left: 10px; padding-left: 5px; border-left: 1px solid #ccc; }
.wa-resize-btn { cursor: pointer; color: #72777d; user-select: none; width: 20px; height: 14px; display: flex; align-items: center; justify-content: center; transition: color 0.1s ease-in-out; }
.wa-resize-btn:hover { color: #36c; }
.wa-resize-btn.wa-resize-disabled { color: #ccc; cursor: default; }
#wa-proc-header { margin-top: 15px !important; border-bottom: none !important; cursor: default; }
#wa-proc-title { font-weight: bold; padding: 10px; display: block; }
#wa-proc-content { padding: 0 10px 15px 10px; }
#wa-editor-area { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--background-color-base, #fff); position: relative; overflow: hidden; }
#wa-editor-textarea { flex: 1; height: 100%; font-family: monospace; font-size: 13px; border: none; outline: none; padding: 10px; resize: none; width: 100%; }
.cm-editor { height: 100% !important; flex: 1; }
.wa-section-header { margin-top: 12px; border-bottom: 1px solid #eee; width: 100%; display: block; margin-left: 0 !important; }
#wa-content-area .wa-section-header:first-child, #wa-content-area .wa-section-header.oo-ui-buttonElement-frameless:first-child { margin-top: 0; margin-left: 0 !important; }
.wa-section-header > .oo-ui-buttonElement-button { text-align: left; padding: 10px 10px !important; margin: 0 !important; display: block; width: 100%; position: relative; border-left: 3px solid #3f6fcf !important; border-radius: 3px !important; background-color: transparent !important; }
.wa-section-header > .oo-ui-buttonElement-button:focus { outline: none !important; }
.wa-section-header .oo-ui-labelElement-label { font-weight: bold; padding-left: 0 !important; margin-left: 0 !important; color: var(--color-base, #202122); }
.wa-section-header .oo-ui-indicatorElement-indicator { position: absolute; right: 10px !important; top: 50%; margin-top: -10px; left: auto !important; width: 20px; }
.wa-foldable-content { display: none; padding: 10px 0; }
.wa-source-options { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; border-top: none; padding: 8px; margin-bottom: 10px; font-size: 0.9em; }
.wa-opt-row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 5px; }
.wa-opt-label { font-weight: bold; width: 100%; margin-bottom: 5px; color: var(--color-base, #202122); }
.wa-opt-row > div { margin-top: 8px !important; margin-bottom: 8px !important; }
.wa-rule-row { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; padding: 8px; margin-bottom: 8px; border-radius: 4px; display: flex; align-items: stretch; transition: background-color 0.3s; }
.wa-rule-row.wa-highlight { background-color: var(--background-color-interactive, #eaecf0); border-color: #36c; }
.wa-rule-controls { display: flex; flex-direction: column; justify-content: center; gap: 0px; padding-right: 4px; border-right: 1px solid #eee; margin-right: 8px; }
.wa-rule-btn { margin: 0 !important; margin-right: 0 !important; margin-left: 0 !important; }
.wa-rule-btn > .oo-ui-buttonElement-button { margin: 0 !important; }
.wa-rule-content { flex: 1; min-width: 0; }
.wa-rule-opt-row { display: flex; justify-content: space-between; align-items: center; margin-top: 5px; }
#wa-ns-selector { width: 100%; margin-bottom: 10px; font-family: sans-serif; font-size: 0.9em; border: 1px solid #a2a9b1; }
.wa-lib-dialog > .oo-ui-window-frame { width: 80vw !important; max-width: none !important; height: 80vh !important; max-height: none !important; }
.wa-lib-editorwrapper { height: 100%; border: 1px solid #c8ccd1; position: relative; boxSizing: border-box; }
.wa-page-list-raw textarea { font-family: monospace; font-size: 0.9em; white-space: pre; overflow-x: auto; }
.wa-list-running textarea { background-color: var(--background-color-neutral-subtle, #f8f8f8) !important; color: var(--color-base, #202122) !important; }
.wa-grid-container { display: flex; gap: 6px; margin-bottom: 10px; }
.wa-grid-col { flex: 1; display: flex; flex-direction: column; gap: 6px; }
.wa-grid-col .oo-ui-buttonWidget { width: 100%; }
.wa-grid-col .oo-ui-buttonWidget .oo-ui-buttonElement-button { width: 100%; text-align: center; justify-content: center; }
.wa-toolbar { display: flex; justify-content: flex-end; align-items: center; gap: 4px; border-bottom: 1px solid #eee; padding-bottom: 4px; margin-bottom: 4px; }
.wa-list-counter { margin-right: auto; font-weight: bold; color: var(--color-subtle, #54595d); font-size: 0.9em; padding-left: 5px; }
.wa-project-bar { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 10px; margin: 8px 0; justify-content: center; }
.wa-project-bar .oo-ui-buttonElement-button { padding-left: 36px !important; padding-right: 12px !important; font-size: 0.9em; }
.wa-project-bar .oo-ui-iconElement-icon { left: 10px !important; }
.wa-settings-header { font-weight: bold; color: var(--color-subtle, #54595d); margin-bottom: 8px; display: block; text-transform: uppercase; font-size: 0.9em; }
.wa-setting-row { display: flex; align-items: center; margin-bottom: 6px; }
.wa-bot-row { background: var(--background-color-success-subtle, #dff2eb); border: 1px solid #a5d6a7; padding: 8px; margin-bottom: 10px; border-radius: 4px; display: flex; align-items: center; justify-content: flex-start; gap: 15px; }
table.diff { width: 100%; font-family: "Adwaita Mono", "Courier New", monospace }
table.diff td { vertical-align: top; }
table.diff tr:hover td { background-color: var(--background-color-progressive-subtle--hover, #d9e2ff); cursor: pointer; }
@keyframes wa-pulse-red { 0% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0.4); border-color: #ff0000; } 70% { box-shadow: 0 0 0 6px rgba(255, 0, 0, 0); border-color: #ff0000; } 100% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0); border-color: #ff0000; } }
.wa-summary-warning input { animation: wa-pulse-red 1s infinite; border-color: #ff0000 !important; }
`;
$('<style>').text(styles).appendTo('head');
$('body').empty();
// =====================================================================
// 3. HELPER FUNCTIONS
// =====================================================================
function checkPermissions() {
return new Promise(function(resolve) {
var api = new mw.Api();
var projectNs = mw.config.get('wgFormattedNamespaces')[4];
var checkTitles = {
'permissions': projectNs + ':AutoWikiBrowser/CheckPageJSON',
'tag': 'MediaWiki:Tag-wAwB'
};
api.get({
action: 'query',
prop: 'revisions',
titles: Object.values(checkTitles).join('|'),
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(data) {
var pagePerms = data.query.pages.find(p => p.title === checkTitles['permissions']);
var pageTag = data.query.pages.find(p => p.title === checkTitles['tag']);
DO_TAG = pageTag.missing === undefined;
var userName = mw.config.get('wgUserName');
var userGroups = mw.config.get('wgUserGroups');
var isSysop = userGroups.includes('sysop');
if (!pagePerms.missing) {
try {
var content = pagePerms.revisions[0].slots.main.content;
var json = JSON.parse(content);
var inEnabledUsers = json.enabledusers && json.enabledusers.includes(userName);
var inEnabledBots = json.enabledbots && json.enabledbots.includes(userName);
var isBotGroup = userGroups.includes('bot');
var canSave = inEnabledUsers || inEnabledBots || isSysop;
var allowBot = inEnabledBots && isBotGroup;
resolve({
canSave: canSave,
allowBot: allowBot,
saveDelay: 0
});
} catch (e) {
resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
}
} else {
var editCount = mw.config.get('wgUserEditCount');
if (editCount > 500) resolve({
canSave: true,
allowBot: false,
saveDelay: 20000
});
else resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
}
}).catch(function() {
resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
});
});
}
function getUserCode(widget, globalName) {
var val = widget.getValue().trim();
if (!val || val.startsWith('// Enter')) {
if (window[globalName] && typeof window[globalName] === 'function') {
var s = window[globalName].toString();
return s.substring(s.indexOf('{') + 1, s.lastIndexOf('}'));
}
return "";
}
if (val.startsWith('function')) {
return val.substring(val.indexOf('{') + 1, val.lastIndexOf('}'));
}
return val;
}
function normalizeLine(line) {
if (!line) return null;
// Pass through comments/STOP commands (trimmed)
if (line.trim().startsWith('####')) return line.trim();
// Handle Title|Variables
var parts = line.split('|');
var title = parts[0].trim();
if (!title) return null; // Skip if title is empty
// Reassemble: Clean Title + Original Variables (preserving whitespace)
var rest = parts.length > 1 ? parts.slice(1).join('|') : null;
return title + (rest !== null ? '|' + rest : '');
}
function getNormalizedList(text) {
if (!text) return [];
return text.split('\n')
.map(normalizeLine)
.filter(function(l) {
return l !== null;
});
}
function getDeduplicatedList(text) {
if (!text) return [];
var seen = new Set();
var out = [];
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
var clean = normalizeLine(lines[i]);
if (clean && !seen.has(clean)) {
seen.add(clean);
out.push(clean);
}
}
return out;
}
function parseTypoContent(content) {
if (!content) return [];
try {
var $wrapper = $('<body>').html(content);
var rules = [];
$wrapper.find('Typo:not([disabled])').each(function() {
var $t = $(this);
var find = $t.attr('find');
var replace = $t.attr('replace');
if (find && replace !== undefined) {
rules.push({
find: find,
replace: replace,
regex: true,
flags: 'gmu',
enabled: true,
isFunc: false
});
}
});
return rules;
} catch (e) {
return [];
}
}
function updateSummaryPreview(baseText) {
var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : (baseText || "");
var finalSum = base + (currentPageSummaryAppend || "");
var previewText = finalSum ? injectVars(finalSum) : '';
$('#wa-summary-preview').val(previewText);
}
function injectVars(text) {
if (!text) return "";
return text.replace(/\$x([A-Z]|x)/g, function(match) {
return currentVars[match] || match; // Swap it, or leave it alone if undefined
});
}
// =====================================================================
// 4. UI CONSTRUCTION
// =====================================================================
checkPermissions().then(function(pState) {
PERMS = pState;
var $main = $('<div>').attr('id', 'wa-root').appendTo('body');
var $left = $('<div>').attr('id', 'wa-left-panel').appendTo($main);
$left.append($('<h3>').append($('<a>').attr('href', DOC_URL).attr('target', '_blank').text(APP_NAME).css({
'text-decoration': 'none',
'color': 'inherit'
})));
$left.append($('<div>').attr('id', 'wa-username').append($('<a>').attr('href', mw.util.getUrl('Special:Contributions/' + mw.config.get('wgUserName'))).attr('target', '_blank').text('User: ' + mw.config.get('wgUserName')).css({
'text-decoration': 'none',
'color': 'inherit'
})));
var btnSaveProj = new OO.ui.ButtonWidget({
icon: 'download',
label: 'Save project',
framed: false,
flags: 'progressive'
});
var btnLoadProj = new OO.ui.ButtonWidget({
icon: 'upload',
label: 'Load project',
framed: false
});
var $projBar = $('<div>').addClass('wa-project-bar').append(btnSaveProj.$element, btnLoadProj.$element);
$left.append($projBar);
var $fileInput = $('<input type="file" accept=".json">').hide().appendTo('body');
var $content = $('<div>').attr('id', 'wa-content-area').appendTo($left);
var $right = $('<div>').attr('id', 'wa-right-panel').appendTo($main);
var $editorHeader = $('<div>').addClass('wa-editor-header').appendTo($right);
var $headerLeft = $('<div>').addClass('wa-header-left').appendTo($editorHeader);
var $statusIndicator = $('<span>').attr('id', 'wa-status-indicator').attr('title', 'Ready').appendTo($headerLeft);
var $titleLink = $('<a>').addClass('wa-title-link').text('Page content').attr('target', '_blank').appendTo($headerLeft);
$('<span>').addClass('wa-header-sep').appendTo($headerLeft);
var $summaryPreview = $('<input type="text">').attr('id', 'wa-summary-preview').attr('autocomplete', 'off').appendTo($headerLeft);
var $headerRight = $('<div>').addClass('wa-header-right').appendTo($editorHeader);
var $infoContainer = $('<span>').addClass('wa-info-container').appendTo($headerRight);
var $toolsContainer = $('<div>').addClass('wa-tools-container').appendTo($headerRight);
var $resizeContainer = $('<div>').addClass('wa-resize-container').appendTo($headerRight);
var $adminTools = $('<div>').addClass('wa-admin-tools').hide().appendTo($toolsContainer);
// Wide chevron SVGs
var svgUp = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 10 L12 2 L22 10" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>';
var svgDown = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 2 L12 10 L22 2" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>';
var $btnSizeUp = $('<div>').addClass('wa-resize-btn').html(svgUp).attr('title', 'Decrease view size');
var $btnSizeDown = $('<div>').addClass('wa-resize-btn').html(svgDown).attr('title', 'Increase view size');
$resizeContainer.append($btnSizeUp, $btnSizeDown);
function setPanelHeight(modeIndex) {
currentHeightMode = modeIndex;
if (currentHeightMode < 0) currentHeightMode = 0;
if (currentHeightMode > 2) currentHeightMode = 2;
$('#wa-visual-output').css('flex-basis', heightValues[currentHeightMode]);
$btnSizeUp.toggleClass('wa-resize-disabled', currentHeightMode === 0);
$btnSizeDown.toggleClass('wa-resize-disabled', currentHeightMode === 2);
}
$btnSizeUp.on('click', function() {
if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode - 1);
});
$btnSizeDown.on('click', function() {
if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode + 1);
});
setPanelHeight(1);
if (CAN_MOVE) {
var btnAdminMove = new OO.ui.ButtonWidget({
icon: 'move',
title: 'Move page to $xA',
disabled: true,
framed: false
});
$adminTools.append(btnAdminMove.$element).show();
}
if (IS_ADMIN) {
var btnAdminDel = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Delete page',
disabled: true,
framed: false
});
var btnAdminProt = new OO.ui.ButtonWidget({
icon: 'lock',
title: 'Protect page',
disabled: true,
framed: false
});
$adminTools.append(btnAdminDel.$element, btnAdminProt.$element).show();
}
var btnManualEdit = new OO.ui.ButtonWidget({
icon: 'edit',
title: 'Open in manual editor',
framed: false,
disabled: true
});
var btnWatch = new OO.ui.ButtonWidget({
icon: 'star',
title: 'Watch this page',
framed: false,
disabled: true,
accessKey: 'w'
});
$toolsContainer.append(btnManualEdit.$element, btnWatch.$element);
var $visualOut = $('<div>').attr('id', 'wa-visual-output').html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready to start...</div>').prependTo($right);
var $editorArea = $('<div>').attr('id', 'wa-editor-area').appendTo($right);
var $textArea = $('<textarea>').attr('id', 'wa-editor-textarea').attr('placeholder', 'Page text will appear here...').appendTo($editorArea);
function setStatus(msg, type) {
if (!msg) msg = "Ready";
$statusIndicator.attr('title', msg).removeClass('wa-status-error wa-status-working');
if (type === 'error') $statusIndicator.addClass('wa-status-error');
if (type === 'working') $statusIndicator.addClass('wa-status-working');
}
// EDITOR OBJECT
var Editor = {
mode: 'textarea',
cmInstance: null,
init: function() {
var self = this;
mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.mode.mediawiki']).then(function(require) {
try {
self.cmInstance = new(require('ext.CodeMirror'))($textArea[0], (require('ext.CodeMirror.mode.mediawiki')).mediawiki());
self.cmInstance.initialize();
self.mode = 'codemirror';
} catch (e) {
console.error("CM Error", e);
}
}).catch(function(err) {
console.error("CM Load Error:", err);
});
$textArea.on('input', updateDirtyState);
},
getValue: function() {
return (this.mode === 'codemirror' && this.cmInstance) ? this.cmInstance.view.state.doc.toString() : $textArea.val();
},
setValue: function(text) {
$textArea.val(text);
if (this.mode === 'codemirror' && this.cmInstance) {
this.cmInstance.view.dispatch({
changes: {
from: 0,
to: this.cmInstance.view.state.doc.length,
insert: text
}
});
} else {
$textArea[0].dispatchEvent(new Event('input'));
}
},
setDisabled: function(d) {
$textArea.prop('disabled', d);
if (this.mode === 'codemirror' && this.cmInstance) {
this.cmInstance.view.contentDOM.contentEditable = !d;
$($textArea).parent().find('.cm-editor').css('opacity', d ? 0.5 : 1);
}
},
scrollToLine: function(n) {
if (isNaN(n)) return;
if (this.mode === 'codemirror' && this.cmInstance) {
var v = this.cmInstance.view;
var l = v.state.doc.line(n);
v.dispatch({
effects: v.constructor.scrollIntoView(l.from, {
y: 'center'
}),
selection: {
anchor: l.from
}
});
v.focus();
}
}
};
var WorkerEngine = {
activeWorker: null,
workerURL: null,
currentLibCode: null,
timeoutTimer: null,
initWorker: function(libCode) {
this.destroy(); // Clean up existing if any
this.currentLibCode = libCode || "";
var scriptContent = this.currentLibCode + "\n\n" + `
self.onmessage = async function(e) {
try {
var data = e.data;
var inputs = data.texts || [data.text];
var vars = data.vars;
var outputs = [];
// Helper to construct async functions dynamically
var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
function inject(str) {
if (!str) return "";
return str.replace(/\\$x([A-Z]|x)/g, function(m) { return vars[m] || ""; });
}
// Returns a Promise and handles 'await' inside user code
async function execUserFunc(code, currentText, currentVars, sharedObj) {
if (!code || code.trim() === "") return currentText;
try {
var func = new AsyncFunction('text', 'vars', 'shared', code);
var res = await func(currentText, currentVars, sharedObj);
if (res && typeof res === 'object' && res.skip) {
return { _skipSignal: true, reason: res.reason || 'Script-requested skip' };
}
return (res !== undefined) ? res : currentText;
} catch (err) {
throw err; // or: return currentText
}
}
var shared = {}; // Shared context for this page
for (var i = 0; i < inputs.length; i++) {
var text = inputs[i];
// 1. Pre-Process
var preRes;
if (data.preCode && data.preCode.trim() !== "") {
preRes = await execUserFunc(data.preCode, text, vars, shared);
} else if (typeof wAwB_Pre === 'function') {
try {
preRes = await wAwB_Pre(text, vars, shared);
if (preRes && typeof preRes === 'object' && preRes.skip) {
preRes = { _skipSignal: true, reason: preRes.reason || 'Script-requested skip' };
}
} catch (err) { preRes = text; }
} else {
preRes = text;
}
if (preRes && preRes._skipSignal) {
self.postMessage({ skipped: true, reason: preRes.reason });
return;
}
text = (preRes !== undefined) ? preRes : text;
// 2. Rules Processing
if (data.rules && data.rules.length > 0) {
data.rules.forEach(function(rule) {
var findStr = inject(rule.find);
if (!findStr) return;
if (rule.isFunc) {
try {
var userFunc = new Function('match', 'groups', 'vars', 'shared', rule.replace);
text = text.replace(new RegExp(findStr, (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '')), function(...args) {
var match = args[0];
var groups = args.slice(1, -2);
try {
var res = userFunc(match, groups, vars, shared);
return res !== undefined ? res : match;
} catch (err) { return match; }
});
} catch (e) {}
} else {
var repStr = inject(rule.replace).replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r");
if (rule.regex) {
try {
var flags = (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '');
text = text.replace(new RegExp(findStr, flags), repStr);
} catch (e) {}
} else {
var finalFind = findStr.replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r");
text = text.split(finalFind).join(repStr);
}
}
});
}
// 3. Post-Process
var postRes;
if (data.postCode && data.postCode.trim() !== "") {
postRes = await execUserFunc(data.postCode, text, vars, shared);
} else if (typeof wAwB_Post === 'function') {
try {
postRes = await wAwB_Post(text, vars, shared);
if (postRes && typeof postRes === 'object' && postRes.skip) {
postRes = { _skipSignal: true, reason: postRes.reason || 'Script-requested skip' };
}
} catch (err) { postRes = text; }
} else {
postRes = text;
}
if (postRes && postRes._skipSignal) {
self.postMessage({ skipped: true, reason: postRes.reason });
return;
}
text = (postRes !== undefined) ? postRes : text;
outputs.push(text);
}
self.postMessage({ success: true, texts: outputs, summaryAppend: shared.summaryAppend, summaryOverride: shared.summaryOverride });
} catch (err) { self.postMessage({ success: false, error: err.toString() }); }
};
`;
var blob = new Blob([scriptContent], {
type: 'application/javascript'
});
this.workerURL = URL.createObjectURL(blob);
this.activeWorker = new Worker(this.workerURL);
},
run: function(payload) {
var self = this;
return new Promise(function(resolve, reject) {
// Re-init if no worker exists, or if the user changed the library code
if (!self.activeWorker || self.currentLibCode !== (payload.libraryCode || "")) {
self.initWorker(payload.libraryCode);
}
if (self.timeoutTimer) clearTimeout(self.timeoutTimer);
self.timeoutTimer = setTimeout(function() {
self.destroy(); // Assassinate the stuck worker
reject("Script timed out (" + SCRIPT_TIMEOUT_MS + "ms).");
}, SCRIPT_TIMEOUT_MS);
self.activeWorker.onmessage = function(e) {
clearTimeout(self.timeoutTimer);
if (e.data.skipped) resolve({
skipped: true,
reason: e.data.reason
});
else if (e.data.success) resolve({
success: true,
texts: e.data.texts,
summaryAppend: e.data.summaryAppend,
summaryOverride: e.data.summaryOverride
});
else reject(e.data.error);
};
self.activeWorker.postMessage(payload);
});
},
destroy: function() {
if (this.activeWorker) {
this.activeWorker.terminate();
this.activeWorker = null;
}
if (this.workerURL) {
URL.revokeObjectURL(this.workerURL);
this.workerURL = null;
}
if (this.timeoutTimer) {
clearTimeout(this.timeoutTimer);
this.timeoutTimer = null;
}
}
};
var PageProtector = {
store: [],
getKey: function() {
var id = this.store.length.toString();
var p = "";
for (var i = 0; i < id.length; i++) {
p += String.fromCharCode(0xE010 + parseInt(id[i]));
}
return '\uE000' + p + '\uE001';
},
protect: function(text, mode, config, templateSpecies = null) {
this.store = [];
var self = this;
var safeRep = function(t, r) {
return t.replace(r, function(m) {
if (!m) return m;
var key = self.getKey();
self.store.push(m);
return key;
});
};
var shouldProcess = function(id) {
if (mode === 'target') return config === id;
return config[id] === true;
};
var matchedBrackets = function(text, op, cl, species = '') {
var newText = "",
depth = 0,
start = 0,
cursor = 0;
var speciesRegex = species ? new RegExp(species, 'iu') : null;
for (var i = 0; i < text.length; i++) {
if (text[i] === op[0] && text.slice(i, i + op.length) === op) {
if (depth === 0) start = i;
depth++;
i += op.length - 1;
} else if (text[i] === cl[0] && text.slice(i, i + cl.length) === cl) {
if (depth > 0) {
depth--;
if (depth === 0) {
var chunk = text.substring(start, i + cl.length);
if (!speciesRegex || speciesRegex.test(chunk)) {
var key = self.getKey();
self.store.push(chunk);
newText += text.substring(cursor, start) + key;
} else {
newText += text.substring(cursor, i + cl.length);
}
cursor = i + cl.length;
}
i += cl.length - 1;
}
}
}
newText += text.substring(cursor);
return newText;
};
PROTECTION_DEFS.forEach(function(def) {
if (shouldProcess(def.id)) {
if (def.id === 'blocks') {
['math', 'pre', 'source', 'syntaxhighlight', 'code', 'gallery'].forEach(t => text = safeRep(text, new RegExp('<' + t + '[^>]*?>[\\s\\S]*?<\\/' + t + '>|<' + t + '[^>]*?/>', 'gi')));
} else if (['templates', 'tables', 'images'].includes(def.id)) {
var activeSpecies = (def.id === 'templates') ? templateSpecies : def.species;
text = matchedBrackets(text, def.open, def.close, activeSpecies || '');
} else if (def.regex) {
text = safeRep(text, def.regex);
}
}
});
return text;
},
restore: function(text) {
var self = this;
var loop = 100;
while (/(\uE000[\uE010-\uE019]+\uE001)/.test(text) && loop > 0) {
text = text.replace(/\uE000([\uE010-\uE019]+)\uE001/g, function(m, d) {
var id = "";
for (var i = 0; i < d.length; i++) id += (d.charCodeAt(i) - 0xE010).toString();
return self.store[parseInt(id, 10)] || m;
});
loop--;
}
return text;
}
};
var accordionRegistry = [];
function addSection(title, $inner) {
var btn = new OO.ui.ButtonWidget({
label: title,
indicator: 'down',
framed: false,
classes: ['wa-section-header']
});
var box = $('<div>').addClass('wa-foldable-content').append($inner);
var sectionObj = {
btn: btn,
box: box,
label: title
};
accordionRegistry.push(sectionObj);
btn.on('click', function() {
var isOpening = !box.is(':visible');
if (isOpening) {
accordionRegistry.forEach(function(sec) {
if (sec !== sectionObj) {
sec.box.hide();
sec.btn.setIndicator('down');
}
});
}
box.toggle();
btn.setIndicator(box.is(':visible') ? 'up' : 'down');
});
$content.append(btn.$element, box);
return sectionObj;
}
// WIDGETS
var srcSelect = new OO.ui.DropdownInputWidget({
options: [{
data: 'cat',
label: 'Category'
}, {
data: 'linksto',
label: 'Pages linking to...'
}, {
data: 'linkson',
label: 'Links on page...'
}, {
data: 'prefix',
label: 'Pages with prefix...'
}, {
data: 'watchlist',
label: 'Watchlist'
}, {
data: 'search',
label: 'Wiki search'
}, {
data: 'usercontribs',
label: 'User contributions'
}, {
data: 'pageswithprop',
label: 'Pages with property'
}]
});
var srcInput = new OO.ui.TextInputWidget({
placeholder: 'Category...'
});
var now = new Date();
var today = now.toISOString().split('T')[0];
var srcInputUser = new OO.ui.TextInputWidget({
placeholder: 'Username'
});
var srcInputStartDate = new OO.ui.TextInputWidget({
value: today + 'T00:00:00',
placeholder: 'ISO start date'
});
var srcInputEndDate = new OO.ui.TextInputWidget({
value: today + 'T23:59:59',
placeholder: 'ISO end date'
});
var srcDropProp = new OO.ui.DropdownInputWidget({
options: []
});
var $optContainer = $('<div>').addClass('wa-source-options').hide();
var $optCat = $('<div>').hide();
var $optUser = $('<div>').hide();
var $optProp = $('<div>').hide();
var chkCatPages = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkCatSub = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkCatFile = new OO.ui.CheckboxInputWidget({
selected: false
});
$optCat.append($('<div>').addClass('wa-opt-label').text('Include:'), new OO.ui.FieldLayout(chkCatPages, {
label: 'Pages',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkCatSub, {
label: 'Subcats',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkCatFile, {
label: 'Files',
align: 'inline'
}).$element);
$optUser.append(new OO.ui.FieldLayout(srcInputUser, {
label: 'User',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInputStartDate, {
label: 'Start (Older)',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInputEndDate, {
label: 'End (Newer)',
align: 'top'
}).$element);
$optProp.append(new OO.ui.FieldLayout(srcDropProp, {
label: 'Property',
align: 'top'
}).$element);
var $optLinks = $('<div>').hide();
var chkLinkWiki = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkLinkTrans = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkLinkImg = new OO.ui.CheckboxInputWidget({
selected: false
});
var dropLinkRedir = new OO.ui.DropdownInputWidget({
options: [{
data: 'nonredirects',
label: 'No redirects'
}, {
data: 'all',
label: 'Both'
}, {
data: 'redirects',
label: 'Redirects only'
}]
});
var chkLinkToRedir = new OO.ui.CheckboxInputWidget({
selected: false
});
$optLinks.append($('<div>').addClass('wa-opt-label').text('What to include:'), $('<div>').addClass('wa-opt-row').append(new OO.ui.FieldLayout(chkLinkWiki, {
label: 'Wikilinks',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkLinkTrans, {
label: 'Transclusions',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkLinkImg, {
label: 'File usage',
align: 'inline'
}).$element), $('<div>').addClass('wa-opt-label').text('Redirects:'), dropLinkRedir.$element, new OO.ui.FieldLayout(chkLinkToRedir, {
label: 'Include links to redirects',
align: 'inline'
}).$element);
$optContainer.append($optCat, $optLinks, $optUser, $optProp);
var queryCache = {};
var lastMode = 'cat';
srcSelect.on('change', function(newMode) {
if (!isLoadingProject) {
if (lastMode !== 'watchlist' && lastMode !== 'usercontribs' && lastMode !== 'pageswithprop') {
queryCache[lastMode] = srcInput.getValue();
}
}
$optContainer.hide();
$optCat.hide();
$optLinks.hide();
$optUser.hide();
$optProp.hide();
srcInput.setDisabled(false).$element.show();
if (newMode === 'cat') {
$optContainer.show();
$optCat.show();
} else if (newMode === 'linksto') {
$optContainer.show();
$optLinks.show();
} else if (newMode === 'usercontribs') {
$optContainer.show();
$optUser.show();
srcInput.setDisabled(true).$element.hide();
} else if (newMode === 'pageswithprop') {
$optContainer.show();
$optProp.show();
srcInput.setDisabled(true).$element.hide();
if (!propNamesLoaded) {
new mw.Api().get({
action: 'query',
list: 'pagepropnames',
ppnlimit: 'max'
}).then(function(d) {
if (d.query && d.query.pagepropnames) {
srcDropProp.setOptions(d.query.pagepropnames.map(p => ({
data: p.propname,
label: p.propname
})));
propNamesLoaded = true;
}
});
}
}
if (newMode === 'watchlist') {
srcInput.setValue('');
srcInput.setDisabled(true);
srcInput.$input.attr('placeholder', '(No query needed)');
} else if (newMode !== 'usercontribs' && newMode !== 'pageswithprop') {
srcInput.setValue(queryCache[newMode] || '');
var ph = 'Query...';
if (newMode === 'cat') ph = 'Category name';
if (newMode === 'search') ph = 'Search query...';
if (newMode === 'prefix') ph = 'Page prefix...';
if (newMode === 'linksto') ph = 'Pages linking to this title...';
if (newMode === 'linkson') ph = 'Get links from this page...';
srcInput.$input.attr('placeholder', ph);
}
lastMode = newMode;
});
srcSelect.emit('change', srcSelect.getValue());
var $nsSelect = $('<select>').attr('id', 'wa-ns-selector').attr('multiple', 'multiple').attr('size', '8');
var nsMap = mw.config.get('wgFormattedNamespaces');
for (var id in nsMap) {
if (parseInt(id) >= 0) $nsSelect.append($('<option>').val(id).text(id + ': ' + (nsMap[id] || '(Main)')));
}
$nsSelect.val(['0']);
var btnAdd = new OO.ui.ButtonWidget({
label: 'Add to list',
icon: 'add',
flags: ['primary', 'progressive']
});
var $btnRow = $('<div>').css({
'display': 'flex',
'justify-content': 'flex-end',
'margin-top': '10px'
});
var $fetchStatus = $('<span>').css({
'margin-right': '10px',
'color': '#888',
'font-size': '0.9em',
'align-self': 'center'
}).hide();
$btnRow.append($fetchStatus, btnAdd.$element);
addSection('Source', $('<div>').append(new OO.ui.FieldLayout(srcSelect, {
label: 'Mode',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInput, {
label: 'Query',
align: 'top'
}).$element, $optContainer, $('<div>').text('Namespaces:').css({
'font-weight': 'bold',
'margin-top': '5px'
}), $nsSelect, $btnRow));
var redirMode = new OO.ui.RadioSelectWidget({
items: [new OO.ui.RadioOptionWidget({
data: 'edit',
label: 'Edit the redirect page (Default)'
}), new OO.ui.RadioOptionWidget({
data: 'follow',
label: 'Follow redirect (Edit target)'
}), new OO.ui.RadioOptionWidget({
data: 'skip',
label: 'Skip redirects'
})]
});
redirMode.selectItemByData('edit');
var radSkipExist = new OO.ui.RadioSelectWidget({
items: [new OO.ui.RadioOptionWidget({
data: 'none',
label: 'Process all'
}), new OO.ui.RadioOptionWidget({
data: 'missing',
label: 'Skip if page does not exist'
}), new OO.ui.RadioOptionWidget({
data: 'exists',
label: 'Skip if page exists'
})]
});
radSkipExist.selectItemByData('none');
var chkSkipNoChange = new OO.ui.CheckboxInputWidget({
selected: false
});
var inpSkipContains = new OO.ui.TextInputWidget({
placeholder: 'Text/Regex for Skip if FOUND'
});
var togSkipContainsRegex = new OO.ui.ToggleSwitchWidget({
value: false,
title: 'Use regex'
});
var inpSkipNotContains = new OO.ui.TextInputWidget({
placeholder: 'Text/Regex for Skip if MISSING'
});
var togSkipNotContainsRegex = new OO.ui.ToggleSwitchWidget({
value: false,
title: 'Use regex'
});
var inpSkipCategories = new OO.ui.TextInputWidget({
placeholder: 'Skip if in: Category1|Category2'
});
var inpSkipNotCategories = new OO.ui.TextInputWidget({
placeholder: 'Skip if NOT in: Category1|Category2'
});
var $settingsPanel = $('<div>')
.append($('<span>').addClass('wa-settings-header').text('Redirects'))
.append(redirMode.$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Skip logic'))
.append(new OO.ui.FieldLayout(chkSkipNoChange, {
label: 'Skip if no changes made',
align: 'inline'
}).$element.css('margin-bottom', '8px'))
.append(radSkipExist.$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Content filters'))
.append($('<div>').addClass('wa-setting-row').append(inpSkipContains.$element.css('flex', 1), togSkipContainsRegex.$element.css('margin-left', '5px')))
.append($('<div>').addClass('wa-setting-row').append(inpSkipNotContains.$element.css('flex', 1), togSkipNotContainsRegex.$element.css('margin-left', '5px')))
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Category filters'))
.append(new OO.ui.FieldLayout(inpSkipCategories, {
label: 'Blacklist',
align: 'top'
}).$element)
.append(new OO.ui.FieldLayout(inpSkipNotCategories, {
label: 'Whitelist',
align: 'top'
}).$element);
addSection('Skip', $settingsPanel);
var dropProtMode = new OO.ui.DropdownInputWidget({
options: [{
data: 'protect',
label: 'Protect (Exclude)'
}, {
data: 'target',
label: 'Target (Edit Matches Only)'
}]
});
var inpTemplateFilter = new OO.ui.TextInputWidget({
placeholder: 'Regex: infobox rail line|railway'
});
var $templateFilterLayout = new OO.ui.FieldLayout(inpTemplateFilter, {
label: 'Template filter',
align: 'top'
});
var $protList = $('<div>');
var protCheckboxes = {};
PROTECTION_DEFS.forEach(function(def) {
var chk = new OO.ui.CheckboxInputWidget({
selected: def.isOn
});
protCheckboxes[def.id] = chk;
$protList.append(new OO.ui.FieldLayout(chk, {
label: def.label,
align: 'inline'
}).$element);
});
var targetRadioItems = PROTECTION_DEFS.map(function(def) {
return new OO.ui.RadioOptionWidget({
data: def.id,
label: def.label
});
});
var radTargetSet = new OO.ui.RadioSelectWidget({
items: targetRadioItems
});
var $targetList = $('<div>').hide().append(radTargetSet.$element);
dropProtMode.on('change', function(mode) {
if (mode === 'protect') {
$protList.show();
$targetList.hide();
} else {
$protList.hide();
$targetList.show();
}
});
addSection('Protection', $('<div>').addClass('wa-source-options')
.append(new OO.ui.FieldLayout(dropProtMode, {
label: 'Mode',
align: 'top'
}).$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($protList).append($targetList)
.append($('<div style="margin-top:10px;">').append($templateFilterLayout.$element))
);
var $rulesList = $('<div>');
var btnAddRule = new OO.ui.ButtonWidget({
label: 'Add rule',
icon: 'add'
});
var rulesRegistry = [];
addSection('Rules', $('<div>').append($rulesList, btnAddRule.$element));
var togWikiTypos = new OO.ui.ToggleSwitchWidget({
value: false
});
var lblWikiStatus = $('<div>').css({
'font-size': '0.9em',
'color': '#888',
'margin-top': '2px'
});
var btnLoadLocal = new OO.ui.ButtonWidget({
icon: 'upload',
label: 'Load file',
framed: false
});
var btnClearLocal = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Clear local',
framed: false,
flags: 'destructive',
disabled: true
});
var lblLocalStatus = $('<div>').text('No local rules').css({
'font-size': '0.9em',
'color': '#888',
'margin-top': '2px'
});
var $typoInput = $('<input type="file">').hide().appendTo('body');
var $extRulesPanel = $('<div>').addClass('wa-source-options');
$extRulesPanel.append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'justify-content': 'space-between'
}).append($('<span>').text('Project:AutoWikiBrowser/Typos').css('font-weight', 'bold'), togWikiTypos.$element),
$('<div>').css('margin-bottom', '10px').append(lblWikiStatus),
$('<hr>').css('border-top', '1px solid #eee'),
$('<div>').append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<span>').text('Local rules (session only)').css({
'font-weight': 'bold'
}), $('<div>').css('flex', '1'), btnLoadLocal.$element, btnClearLocal.$element), lblLocalStatus)
);
addSection('External rules', $extRulesPanel);
var txtPreScript = new OO.ui.MultilineTextInputWidget({
rows: 6,
value: '',
placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;'
});
var txtPostScript = new OO.ui.MultilineTextInputWidget({
rows: 6,
value: '',
placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;'
});
var btnLoadLib = new OO.ui.ButtonWidget({
icon: 'upload',
title: 'Load library (.js)',
framed: false
});
var btnRemoveLib = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Remove library',
framed: false,
flags: 'destructive'
});
var txtLibStatus = new OO.ui.TextInputWidget({
value: '(No library loaded)',
readOnly: true
});
var $libInput = $('<input type="file" accept=".js">').hide().appendTo('body');
var btnEditLib = new OO.ui.ButtonWidget({
icon: 'edit',
label: 'Edit project library',
framed: false
});
var $scriptPanel = $('<div>').append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'gap': '5px',
'margin-bottom': '10px'
}).append($('<span>').text('JS library:').css({
'font-weight': 'bold',
'white-space': 'nowrap'
}), txtLibStatus.$element.css('flex', '1'), btnLoadLib.$element, btnRemoveLib.$element),
$('<div>').css({
'display': 'flex',
'justify-content': 'flex-end',
'margin-bottom': '10px'
}).append(btnEditLib.$element),
new OO.ui.FieldLayout(txtPreScript, {
label: 'Pre-Process',
align: 'top'
}).$element,
new OO.ui.FieldLayout(txtPostScript, {
label: 'Post-Process',
align: 'top'
}).$element
);
addSection('Scripts', $scriptPanel);
function updateLibUI() {
if (currentLibrary.code) {
txtLibStatus.setValue(currentLibrary.name);
btnRemoveLib.setDisabled(false);
} else {
txtLibStatus.setValue('(No library loaded)');
btnRemoveLib.setDisabled(true);
}
}
updateLibUI();
function LibraryEditorDialog(config) {
LibraryEditorDialog.super.call(this, config);
}
OO.inheritClass(LibraryEditorDialog, OO.ui.ProcessDialog);
LibraryEditorDialog.static.name = 'libraryEditor';
LibraryEditorDialog.static.title = 'Edit project library';
LibraryEditorDialog.static.actions = [{
action: 'save',
label: 'Save',
flags: ['primary', 'progressive']
},
{
label: 'Cancel',
flags: 'safe'
}
];
LibraryEditorDialog.prototype.initialize = function() {
LibraryEditorDialog.super.prototype.initialize.call(this);
this.$element.addClass('wa-lib-dialog'); // Attach our custom CSS override class
this.panel = new OO.ui.PanelLayout({
padded: true,
expanded: true
});
this.$editorWrapper = $('<div>').addClass('wa-lib-editorwrapper');
this.panel.$element.append(this.$editorWrapper);
this.$body.append(this.panel.$element);
};
LibraryEditorDialog.prototype.getSetupProcess = function(data) {
data = data || {};
return LibraryEditorDialog.super.prototype.getSetupProcess.call(this, data)
.next(function() {
var self = this;
self.$editorWrapper.empty();
// Create a textarea for the MediaWiki CM wrapper to properly bind to
var $libTextArea = $('<textarea>').appendTo(self.$editorWrapper);
var initCode = currentLibrary.code || "// All custom library functions defined here will be passed to the worker.\n// Special functions:\n// function wAwB_Pre(text, vars, shared) { return text; }\n// function wAwB_Post(text, vars, shared) { return text; }\n";
return mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.modes']).then(function(require) {
var CM = require('ext.CodeMirror');
var modes = require('ext.CodeMirror.modes');
self.cmInstance = new CM($libTextArea[0], modes.javascript());
self.cmInstance.initialize();
self.cmInstance.view.dispatch({
changes: {
from: 0,
insert: initCode
}
});
// Force CodeMirror to fill the wrapper
self.$editorWrapper.find('.cm-editor').css({
height: '100%'
});
}).catch(function(err) {
console.error("wAwB CM Init Error:", err);
});
}, this);
};
LibraryEditorDialog.prototype.getActionProcess = function(action) {
var dialog = this;
if (action === 'save') {
return new OO.ui.Process(function() {
var newCode = "";
if (dialog.cmInstance) {
newCode = dialog.cmInstance.view.state.doc.toString();
}
if (newCode.trim() === "") {
currentLibrary = {
name: null,
code: null
};
} else {
currentLibrary.code = newCode;
currentLibrary.name = "custom code";
}
updateLibUI();
dialog.close({
action: action
});
});
}
if (action === 'cancel' || !action) {
return new OO.ui.Process(function() {
dialog.close({
action: action
});
});
}
return LibraryEditorDialog.super.prototype.getActionProcess.call(this, action);
};
LibraryEditorDialog.prototype.getTeardownProcess = function(data) {
return LibraryEditorDialog.super.prototype.getTeardownProcess.call(this, data)
.next(function() {
if (this.cmInstance) {
try {
this.cmInstance.view.destroy();
} catch (e) {}
this.cmInstance = null;
}
}, this);
};
var windowManager = new OO.ui.WindowManager();
$('body').append(windowManager.$element);
var libDialog = new LibraryEditorDialog();
windowManager.addWindows([libDialog]);
btnEditLib.on('click', function() {
windowManager.openWindow(libDialog);
});
var togAdminEnable = new OO.ui.ToggleSwitchWidget({
value: false
});
var chkMovRedirect = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkMovTalk = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkMovSub = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkDelTalk = new OO.ui.CheckboxInputWidget({
selected: true
});
var dropProtEdit = new OO.ui.DropdownInputWidget({
options: [{
data: '',
label: '(No Change)'
}, {
data: 'all',
label: 'All'
}, {
data: 'autoconfirmed',
label: 'Autoconfirmed'
}, {
data: 'sysop',
label: 'Sysop'
}]
});
var dropProtMove = new OO.ui.DropdownInputWidget({
options: [{
data: '',
label: '(No Change)'
}, {
data: 'all',
label: 'All'
}, {
data: 'autoconfirmed',
label: 'Autoconfirmed'
}, {
data: 'sysop',
label: 'Sysop'
}]
});
var inpProtExpiry = new OO.ui.TextInputWidget({
placeholder: 'infinite / 2 days / 12 hours'
});
if (CAN_MOVE || IS_ADMIN) {
var $adminPanel = $('<div>').append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'justify-content': 'flex-start',
'gap': '10px'
}).append($('<span>').text('Enable page actions').css('font-weight', 'bold'), togAdminEnable.$element),
$('<hr>')
);
if (CAN_MOVE) {
$adminPanel.append(
$('<strong>').text('Move options:'), new OO.ui.FieldLayout(chkMovRedirect, {
label: 'Do not create redirect',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkMovTalk, {
label: 'Move talk page',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkMovSub, {
label: 'Move subpages',
align: 'inline'
}).$element, $('<br>')
);
}
if (IS_ADMIN) {
$adminPanel.append(
$('<strong>').text('Delete options:'), new OO.ui.FieldLayout(chkDelTalk, {
label: 'Delete talk page',
align: 'inline'
}).$element, $('<br>'),
$('<strong>').text('Protect options:'), new OO.ui.FieldLayout(dropProtEdit, {
label: 'Edit level',
align: 'top'
}).$element, new OO.ui.FieldLayout(dropProtMove, {
label: 'Move level',
align: 'top'
}).$element, new OO.ui.FieldLayout(inpProtExpiry, {
label: 'Expiry',
align: 'top'
}).$element
);
}
addSection('Page actions', $adminPanel);
}
var btnPower = new OO.ui.ButtonWidget({
label: 'Start',
icon: 'power',
flags: ['primary', 'progressive'],
title: 'Start editing',
accessKey: 'a'
});
var btnDiff = new OO.ui.ButtonWidget({
label: 'Diff',
icon: 'update',
title: 'Show diff',
accessKey: 'd'
});
var btnSkip = new OO.ui.ButtonWidget({
label: 'Next',
icon: 'next',
title: 'Skip to next page',
accessKey: 'n',
disabled: true
});
var btnPreview = new OO.ui.ButtonWidget({
label: 'Preview',
icon: 'article',
title: 'Preview page',
accessKey: 'p'
});
var btnSave = new OO.ui.ButtonWidget({
label: 'Save',
icon: 'upload',
flags: 'progressive',
title: 'Save edit',
accessKey: 's',
disabled: true
});
var inputSummary = new OO.ui.TextInputWidget({
placeholder: '',
value: '',
title: 'Enter edit summary',
accessKey: 'b'
});
var $sumLayout = new OO.ui.FieldLayout(inputSummary, {
label: 'Edit summary',
align: 'top'
}).$element;
$sumLayout.css('margin-bottom', '6px');
var listTextarea = new OO.ui.MultilineTextInputWidget({
rows: 15,
classes: ['wa-page-list-raw']
});
var btnSort = new OO.ui.ButtonWidget({
icon: 'sortVertical',
title: 'Sort list',
framed: false
});
var btnDedup = new OO.ui.ButtonWidget({
icon: 'funnel',
title: 'Remove duplicates',
framed: false
});
var btnClear = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Clear list',
framed: false
});
var btnPreParse = new OO.ui.ButtonWidget({
label: 'Pre-parse',
title: 'Process list in background',
icon: 'robot',
framed: false
});
var $listCounter = $('<span>').addClass('wa-list-counter').text('0 pages');
var togAutoSave = new OO.ui.ToggleSwitchWidget({
value: false
});
var txtAutoDelay = new OO.ui.TextInputWidget({
value: '10'
});
var $botRow = $('<div>').addClass('wa-bot-row').hide();
if (PERMS.allowBot) {
$botRow.show().append($('<span>').css('font-weight', 'bold').text('Bot mode: '), togAutoSave.$element, $('<span>').text('Delay (s):'), txtAutoDelay.$element.css('max-width', '40px'));
togAutoSave.on('change', function(v) {
if (v) txtAutoDelay.setValue('10');
});
}
var sortAsc = true;
var $procHeader = $('<div>').addClass('wa-section-header').attr('id', 'wa-proc-header').css({
'display': 'flex',
'justify-content': 'space-between',
'align-items': 'center'
});
var $procTitle = $('<span>').attr('id', 'wa-proc-title').text('Processing');
var chkMinor = new OO.ui.CheckboxInputWidget({
selected: true,
title: 'Minor edit'
});
var $minorLayout = new OO.ui.FieldLayout(chkMinor, {
label: 'm',
align: 'inline',
title: 'Minor edit'
});
$minorLayout.$element.css({
'margin-right': '15px',
'font-weight': 'normal'
});
$procHeader.append($procTitle, $minorLayout.$element);
var $procContent = $('<div>').attr('id', 'wa-proc-content').append(
$sumLayout, $botRow,
$('<div>').addClass('wa-grid-container').append(
$('<div>').addClass('wa-grid-col').append(btnPower.$element),
$('<div>').addClass('wa-grid-col').append(btnDiff.$element, btnSkip.$element),
$('<div>').addClass('wa-grid-col').append(btnPreview.$element, btnSave.$element)
),
$('<div>').addClass('wa-toolbar').append($listCounter, btnSort.$element, btnDedup.$element, btnClear.$element),
listTextarea.$element,
$('<div>').css({
'margin-top': '5px'
}).append(btnPreParse.$element)
);
$content.append($procHeader, $procContent);
var configWidgets = [
srcSelect, srcInput, srcInputUser, srcInputStartDate, srcInputEndDate, srcDropProp,
chkCatPages, chkCatSub, chkCatFile, chkLinkWiki, chkLinkTrans, chkLinkImg, dropLinkRedir, chkLinkToRedir,
btnAdd, redirMode, chkSkipNoChange, radSkipExist,
inpSkipContains, togSkipContainsRegex, inpSkipNotContains, togSkipNotContainsRegex, inpSkipCategories, inpSkipNotCategories,
dropProtMode, radTargetSet, inpTemplateFilter, btnAddRule,
txtPreScript, txtPostScript, chkMovRedirect, chkMovTalk, chkMovSub, chkDelTalk, dropProtEdit, dropProtMove, inpProtExpiry,
togWikiTypos, btnLoadLocal, btnClearLocal, btnPreParse
];
// =====================================================================
// 5. FUNCTION DEFINITIONS (Core Logic)
// =====================================================================
function checkSummaryWarning() {
var val = inputSummary.getValue();
var isBlank = !val || val.trim() === "";
if (isBlank || hasNewSources) inputSummary.$element.addClass('wa-summary-warning');
else inputSummary.$element.removeClass('wa-summary-warning');
}
function renderCurrentView() {
if (currentViewMode === 'preview') renderPreview();
else renderDiff();
}
function toggleConfig(isLocked) {
configWidgets.forEach(function(w) {
if (w instanceof OO.ui.TextInputWidget || w instanceof OO.ui.MultilineTextInputWidget) {
w.setReadOnly(isLocked);
w.$element.css('opacity', isLocked ? 0.8 : 1);
} else {
w.setDisabled(isLocked);
}
});
$nsSelect.prop('disabled', isLocked);
for (var key in protCheckboxes) protCheckboxes[key].setDisabled(isLocked);
rulesRegistry.forEach(function(r) {
r.find.setReadOnly(isLocked);
r.rep.setReadOnly(isLocked);
r.regex.setDisabled(isLocked);
r.flags.setReadOnly(isLocked);
r.enable.setDisabled(isLocked);
r.del.setDisabled(isLocked);
r.btnFunc.setDisabled(isLocked || !r.regex.getValue());
r.btnUp.setDisabled(isLocked || rulesRegistry.indexOf(r) === 0);
r.btnDown.setDisabled(isLocked || rulesRegistry.indexOf(r) === rulesRegistry.length - 1);
});
if (CAN_MOVE || IS_ADMIN) togAdminEnable.setDisabled(isLocked);
btnLoadLib.setDisabled(isLocked);
btnRemoveLib.setDisabled(isLocked || !currentLibrary.code);
btnEditLib.setDisabled(isLocked);
btnLoadLocal.setDisabled(isLocked);
btnClearLocal.setDisabled(isLocked || localTypos.length === 0);
}
function updateListCount() {
var val = listTextarea.getValue();
var count = val.trim() ? val.split('\n').filter(function(l) {
var line = l.trim();
return line !== "" && !line.startsWith("####");
}).length : 0;
$listCounter.text(count + ' pages');
}
listTextarea.on('change', updateListCount);
function updateDirtyState() {
if (isRunning && currentTitle && Editor.getValue() !== originalWikitext) $editorHeader.addClass('wa-dirty');
else $editorHeader.removeClass('wa-dirty');
}
function removeTopLine() {
var l = listTextarea.getValue().split('\n');
l.shift();
listTextarea.setValue(l.join('\n'));
updateListCount();
}
function updateInterfaceMode() {
var isAdminMode = togAdminEnable.getValue();
var pageLoaded = !!currentTitle;
btnSave.setDisabled(isAdminMode || !pageLoaded || !PERMS.canSave);
btnSkip.setDisabled(!pageLoaded);
btnPreview.setDisabled(!pageLoaded);
btnDiff.setDisabled(isAdminMode || !pageLoaded);
Editor.setDisabled(isAdminMode || !pageLoaded);
if (CAN_MOVE) {
var allowAdmin = isAdminMode && currentPageExists;
btnAdminMove.setDisabled(!(allowAdmin && currentVars['$xA']));
if (currentVars['$xA']) btnAdminMove.setTitle('Move page to ' + currentVars['$xA']);
else btnAdminMove.setTitle('Move page to $xA (Variable not set)');
}
if (IS_ADMIN) {
var allowAdmin = isAdminMode && currentPageExists;
btnAdminDel.setDisabled(!allowAdmin);
btnAdminProt.setDisabled(!allowAdmin);
}
}
function renderDiff() {
$visualOut.html('<div style="color:#888; text-align:center;">Generating Diff...</div>');
var currentText = Editor.getValue();
new mw.Api().post({
'action': 'compare',
fromtitle: currentTitle,
toslots: 'main',
'totext-main': currentText,
slots: 'main',
topst: window.wa_diffPST ? true : undefined,
prop: 'diff',
formatversion: 2
}).then(function(data) {
var diffBody = data.compare && data.compare.bodies && data.compare.bodies.main;
if (diffBody) {
$visualOut.html('<h4>Diff: ' + currentTitle + '</h4><table class="diff"><colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup><tbody>' + diffBody + '</tbody></table>');
processDiffTable();
} else {
$visualOut.html('<div style="color:green; text-align:center; padding-top:20px;">No Changes detected</div>');
}
});
}
function processDiffTable() {
var rightLineNum = 0;
$visualOut.find('table.diff tr').each(function() {
var $tr = $(this);
var $linenos = $tr.find('td.diff-lineno');
if ($linenos.length > 0) {
var txt = $linenos.last().text();
var m = txt.match(/(\d+)/);
if (m) rightLineNum = parseInt(m[1]);
return;
}
if ($tr.find('.diff-addedline').length > 0 || $tr.find('.diff-context').length > 0) {
$tr.attr('data-line', rightLineNum);
$tr.css('cursor', 'pointer').attr('title', 'Jump to line ' + rightLineNum);
rightLineNum++;
}
});
// Attach a single delegated click listener to the table instead of every row
$visualOut.find('table.diff').on('click', 'tr[data-line]', function() {
Editor.scrollToLine(parseInt($(this).attr('data-line')));
});
}
function renderPreview() {
$visualOut.html('<div style="color:#888; text-align:center;">Generating Preview...</div>');
new mw.Api().post({
action: 'parse',
title: currentTitle,
text: Editor.getValue(),
prop: 'text|categorieshtml|modules|jsconfigvars',
useskin: mw.config.get('skin'),
disablelimitreport: true,
pst: true,
contentmodel: 'wikitext'
}).then(function(data) {
if (data.parse && data.parse.text) {
var $prev = $('<div>').html(data.parse.text['*']);
if (data.parse.categorieshtml) $prev.append(data.parse.categorieshtml['*']);
$prev.find('a').attr('target', '_blank');
$visualOut.empty().append($prev);
mw.loader.using(data.parse.modules.concat(data.parse.modulestyles, data.parse.modulescripts), function() {
mw.hook('wikipage.content').fire($('.wa-visual-output .mw-parser-output'));
});
}
}).catch(function(err) {
$visualOut.html('Error generating preview.');
alert("Preview failed: " + err);
});
}
async function transformPageText(rawText, title, config) {
var filters = config.filters;
if (filters) {
var check = function(text, rule) {
if (!rule || !rule.val) return false;
if (rule.regex) {
try {
return new RegExp(rule.val, 'mu').test(text);
} catch (e) {
return false;
}
}
return text.indexOf(rule.val) !== -1;
};
if (filters.skipContains && filters.skipContains.val && check(rawText, filters.skipContains)) {
return {
skipped: true,
reason: 'Contains: ' + filters.skipContains.val
};
}
if (filters.skipNotContains && filters.skipNotContains.val && !check(rawText, filters.skipNotContains)) {
return {
skipped: true,
reason: 'Missing: ' + filters.skipNotContains.val
};
}
}
var mode = config.mode;
var inputs = [];
var compiledSpecies = null;
if (config.templateFilter) {
var tFilter = config.templateFilter;
if (tFilter[0] === "^") tFilter = "^\\{\\{\\s*" + tFilter.slice(1);
else tFilter = "\\{\\{\\s*" + tFilter;
compiledSpecies = tFilter + "(?=\\s*[|}\\n])";
}
var skeleton = PageProtector.protect(rawText, mode, config.excludes, compiledSpecies);
if (mode === 'target') inputs = PageProtector.store;
else inputs = [skeleton];
var combinedRules = rulesRegistry.filter(r => r.isActive()).map(r => ({
find: r.find.getValue(),
replace: r.rep.getValue(),
regex: r.regex.getValue(),
flags: r.flags.getValue(),
enabled: r.isActive(),
isFunc: r.isFunc()
}));
if (togWikiTypos.getValue()) combinedRules = combinedRules.concat(wikiTypos);
if (localTypos.length > 0) combinedRules = combinedRules.concat(localTypos);
var payload = {
texts: inputs,
vars: config.vars,
preCode: getUserCode(txtPreScript, 'wAwB_Pre'),
libraryCode: currentLibrary.code,
rules: combinedRules,
postCode: getUserCode(txtPostScript, 'wAwB_Post')
};
var result = await WorkerEngine.run(payload);
if (result.skipped) return {
skipped: true,
reason: result.reason
};
var finalText = "";
if (mode === 'target') {
PageProtector.store = result.texts;
finalText = PageProtector.restore(skeleton);
} else {
finalText = PageProtector.restore(result.texts[0]);
}
return {
skipped: false,
text: finalText,
summaryAppend: result.summaryAppend,
summaryOverride: result.summaryOverride
};
}
async function processPageContent() {
try {
setStatus('Processing...', 'working');
var mode = dropProtMode.getValue();
var activeConfig = {
mode: mode,
excludes: {},
templateFilter: inpTemplateFilter.getValue().trim(),
vars: currentVars,
filters: {
skipContains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
skipNotContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
}
}
};
if (mode === 'protect') {
for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected();
} else {
var sel = radTargetSet.findSelectedItem();
activeConfig.excludes = sel ? sel.getData() : null;
}
var res = await transformPageText(originalWikitext, currentTitle, activeConfig);
if (res.skipped) {
removeTopLine();
loadNextPage();
return;
}
currentPageSummaryAppend = res.summaryAppend || "";
currentPageSummaryOverride = res.summaryOverride || null;
updateSummaryPreview(inputSummary.getValue());
if (chkSkipNoChange.isSelected() && res.text === originalWikitext) {
removeTopLine();
loadNextPage();
return;
}
setStatus('Ready');
Editor.setValue(res.text);
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
else {
Editor.setDisabled(false);
btnSave.setDisabled(!PERMS.canSave);
btnSkip.setDisabled(false);
btnPreview.setDisabled(false);
btnDiff.setDisabled(false);
}
updateDirtyState();
renderCurrentView();
if (PERMS.allowBot && togAutoSave.getValue()) {
var delay = Math.max(0, parseInt(txtAutoDelay.getValue(), 10) || 0) * 1000;
setStatus('Auto-save in ' + (delay / 1000) + 's...', 'working');
if (autoSaveTimer) clearTimeout(autoSaveTimer);
autoSaveTimer = setTimeout(function() {
if (isRunning && PERMS.canSave) {
btnSave.emit('click');
}
}, delay);
}
} catch (e) {
setStatus('Error', 'error');
alert(e);
btnPower.emit('click');
}
}
async function runPreParseBatch() {
// 1. Toggle / Stop Logic
if (isRunning) {
isRunning = false;
setStatus('Stopping...', 'working');
btnPreParse.setLabel('Pre-parse');
return;
}
// 2. Start & Deduplicate
var currentVal = listTextarea.getValue();
var cleanVal = getDeduplicatedList(currentVal).join('\n');
listTextarea.setValue(cleanVal);
updateListCount();
isRunning = true;
toggleUI(true);
// 3. Lock UI
toggleUI(true);
btnSkip.setDisabled(true);
btnDiff.setDisabled(true);
btnPreview.setDisabled(true);
btnSave.setDisabled(true);
Editor.setDisabled(true);
btnPreParse.setLabel('Stop pre-parse');
// Inject STOP marker if not present
var currentList = listTextarea.getValue().split('\n');
if (!currentList.includes('####STOP')) {
currentList.push('####STOP');
listTextarea.setValue(currentList.join('\n'));
}
// Gather Config
var activeConfig = {
mode: dropProtMode.getValue(),
excludes: {},
templateFilter: inpTemplateFilter.getValue().trim(),
vars: {},
filters: {
skipContains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
skipNotContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
}
}
};
if (activeConfig.mode === 'protect') {
for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected();
} else {
var sel = radTargetSet.findSelectedItem();
activeConfig.excludes = sel ? sel.getData() : null;
}
setStatus('Pre-parsing...', 'working');
while (isRunning) {
var lines = listTextarea.getValue().split('\n');
var batchTitles = [];
var stopFound = false;
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (line === '####STOP') {
stopFound = true;
break;
}
if (line && !line.startsWith('####')) {
var parts = line.split('|');
batchTitles.push({
fullLine: line,
title: parts[0],
vars: parts.slice(1)
});
}
if (batchTitles.length >= 50) break;
}
if (batchTitles.length === 0) {
if (stopFound) setStatus('Pre-parse complete');
else setStatus('List empty');
break;
}
$listCounter.text('Fetching ' + batchTitles.length + '...');
var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var api = new mw.Api();
try {
var data = await api.get({
action: 'query',
prop: 'revisions' + (badCats.length + reqCats.length > 0 ? '|categories' : ''),
titles: batchTitles.map(t => t.title).join('|'),
rvprop: 'content',
rvslots: 'main',
redirects: 1,
cllimit: 'max'
});
var pageMap = {};
if (data.query && data.query.pages) Object.values(data.query.pages).forEach(p => pageMap[p.title] = p);
var redirMap = {};
if (data.query && data.query.redirects) data.query.redirects.forEach(r => redirMap[r.from] = r.to);
var keptLines = [];
for (var k = 0; k < batchTitles.length; k++) {
var item = batchTitles[k];
var lookupTitle = redirMap[item.title] || item.title;
var page = pageMap[lookupTitle];
if (!page || page.missing || page.invalid || !page.revisions || !page.revisions[0]) {
console.warn("Skipping invalid/missing page:", item.title);
continue;
}
var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim()));
if (badCats.some(c => pageCats.has(c))) continue; // Skip
if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) continue; // Skip
var rawText = page.revisions[0].slots.main['*'];
activeConfig.vars = {
'$xx': item.title
};
item.vars.forEach((v, idx) => activeConfig.vars['$x' + String.fromCharCode(65 + idx)] = v);
var res = await transformPageText(rawText, item.title, activeConfig);
// UPDATED LOGIC: Respect "Skip if no change" checkbox
if (!res.skipped && (!chkSkipNoChange.isSelected() || res.text !== rawText)) {
keptLines.push(item.fullLine);
}
}
var freshLines = listTextarea.getValue().split('\n');
var stopIndex = -1;
for (var x = 0; x < freshLines.length; x++) {
if (freshLines[x] === '####STOP') {
stopIndex = x;
break;
}
}
if (stopIndex > -1) {
var topChunk = freshLines.slice(0, stopIndex);
var botChunk = freshLines.slice(stopIndex + 1);
var processedSet = new Set(batchTitles.map(t => t.fullLine));
var newTop = topChunk.filter(l => !processedSet.has(l));
var newList = newTop.concat(['####STOP']).concat(botChunk).concat(keptLines);
listTextarea.setValue(newList.join('\n'));
updateListCount();
}
} catch (e) {
console.error(e);
setStatus('Batch error: ' + e, 'error');
break;
}
}
isRunning = false;
toggleUI(false);
WorkerEngine.destroy();
btnPreParse.setLabel('Pre-parse');
if (listTextarea.getValue().startsWith('####STOP')) setStatus('Pre-parse done!');
else setStatus('Stopped');
}
btnPreParse.on('click', runPreParseBatch);
function loadNextPage() {
if (!isRunning) return;
var allLines = listTextarea.getValue().split('\n');
var listChanged = false;
var stopCommand = false;
while (allLines.length > 0) {
var line = allLines[0];
if (line === '####STOP') {
stopCommand = true;
break;
}
if (line.startsWith('####') || line === "") {
allLines.shift();
listChanged = true;
} else {
break;
}
}
if (listChanged) {
listTextarea.setValue(allLines.join('\n'));
updateListCount();
}
if (stopCommand) {
btnPower.emit('click');
setStatus("Stopped by ####STOP");
return;
}
if (allLines.length === 0) {
btnPower.emit('click');
setStatus("Done!");
return;
}
var raw = allLines[0];
var parts = raw.split('|');
currentTitle = parts[0].trim();
baseRevId = 0;
originalWikitext = "";
if (!currentTitle) {
removeTopLine();
loadNextPage();
return;
}
currentVars = {};
currentVars['$xx'] = currentTitle;
for (var i = 1; i < parts.length; i++) currentVars['$x' + String.fromCharCode(64 + i)] = parts[i];
currentPageSummaryAppend = "";
currentPageSummaryOverride = null;
updateSummaryPreview(inputSummary.getValue());
setStatus('Loading...', 'working');
btnSave.setDisabled(true);
btnPreview.setDisabled(true);
btnDiff.setDisabled(true);
btnSkip.setDisabled(true);
Editor.setDisabled(true);
$titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle);
$editorHeader.removeClass('wa-dirty');
$visualOut.empty();
Editor.setValue('Loading...');
$infoContainer.empty();
currentPageExists = false;
btnWatch.setDisabled(true);
btnManualEdit.setDisabled(true);
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var api = new mw.Api();
var params = {
action: 'query',
prop: 'revisions|info' + (badCats.length + reqCats.length > 0 ? '|categories' : ''),
titles: currentTitle,
rvprop: 'content|timestamp|ids',
rvslots: 'main',
inprop: 'watched',
cllimit: 'max'
};
var rMode = redirMode.findSelectedItem().getData();
if (rMode === 'follow') params.redirects = 1;
return api.get(params).then(async function(data) {
var pid = Object.keys(data.query.pages)[0];
var page = data.query.pages[pid];
currentPageExists = !page.missing && !page.invalid;
var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim()));
if (badCats.some(c => pageCats.has(c))) {
setStatus('Skip: cat blacklist');
removeTopLine();
loadNextPage();
return;
}
if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) {
setStatus('Skip: cat whitelist');
removeTopLine();
loadNextPage();
return;
}
if (rMode === 'follow' && data.query.redirects) {
currentTitle = page.title;
$titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle);
mw.notify('Redirect followed to: ' + currentTitle);
}
if (rMode === 'skip' && page.redirect !== undefined) {
removeTopLine();
loadNextPage();
return;
}
var skipMode = radSkipExist.findSelectedItem().getData();
if (pid === "-1") {
if (skipMode === 'missing') {
removeTopLine();
loadNextPage();
return;
}
originalWikitext = "";
baseRevId = 0;
} else {
if (skipMode === 'exists') {
removeTopLine();
loadNextPage();
return;
}
originalWikitext = page.revisions[0].slots.main['*'];
baseRevId = page.revisions[0].revid;
}
if (page.revisions && page.revisions.length > 0) {
var rev = page.revisions[0];
var ts = new Date(rev.timestamp).toISOString().replace('T', ' ').substring(0, 16);
$infoContainer.empty().append('Last edit: ' + ts + ' | ', $('<a>').attr('href', mw.util.getUrl(currentTitle, {
action: 'history'
})).attr('target', '_blank').text('history'));
}
btnWatch.setDisabled(!currentPageExists);
btnManualEdit.setDisabled(!currentPageExists);
if (page.watched !== undefined) btnWatch.setIcon('unStar');
else btnWatch.setIcon('star');
if (CAN_MOVE || IS_ADMIN) {
updateInterfaceMode();
if (togAdminEnable.getValue()) {
Editor.setValue(originalWikitext);
renderCurrentView();
setStatus('Ready (Page actions)');
return;
}
}
processPageContent();
}).catch(function(e) {
setStatus('API error', 'error');
alert('Load error: ' + e);
btnPower.emit('click');
});
}
async function fetchWithContinue(api, params) {
var allTitles = new Set();
var continueToken = {};
var safetyLimit = FETCH_SAFETY_LIMIT;
var count = 0;
isFetching = true;
btnAdd.setLabel('Cancel fetch');
$fetchStatus.text('Fetching...').show();
try {
while (isFetching && count < safetyLimit) {
var merged = Object.assign({}, params, continueToken);
var data = await api.get(merged);
var batch = [];
if (data.watchlistraw) batch = data.watchlistraw;
else if (data.query) {
if (data.query.pages) batch = Object.values(data.query.pages);
else if (data.query.categorymembers) batch = data.query.categorymembers;
else if (data.query.backlinks) batch = data.query.backlinks;
else if (data.query.embeddedin) batch = data.query.embeddedin;
else if (data.query.imageusage) batch = data.query.imageusage;
else if (data.query.search) batch = data.query.search;
else if (data.query.allpages) batch = data.query.allpages;
else if (data.query.usercontribs) batch = data.query.usercontribs;
else if (data.query.pageswithprop) batch = data.query.pageswithprop;
}
if (batch.length > 0) {
batch.forEach(item => {
if (item.title) allTitles.add(item.title);
});
count = allTitles.size;
$fetchStatus.text('Fetched ' + count + '...');
}
if (data.continue) continueToken = data.continue;
else break;
}
} catch (e) {
alert("Fetch interrupted: " + e);
}
isFetching = false;
btnAdd.setLabel('Add to list').setDisabled(false);
$fetchStatus.text('Added ' + allTitles.size + ' pages').delay(3000).fadeOut();
if (allTitles.size > 0) {
hasNewSources = true;
checkSummaryWarning();
}
return Array.from(allTitles);
}
function toggleUI(d) {
if (d) {
btnPower.setLabel('Stop').setIcon('power').setFlags(['destructive']);
} else {
btnPower.setLabel('Start').setIcon('power').clearFlags().setFlags(['primary', 'progressive']);
if (PERMS.allowBot) togAutoSave.setValue(false);
}
toggleConfig(d);
btnSort.setDisabled(d);
btnDedup.setDisabled(d);
btnClear.setDisabled(d);
btnSaveProj.setDisabled(d);
btnLoadProj.setDisabled(d);
btnSkip.setDisabled(!d);
btnSave.setDisabled(true);
listTextarea.setReadOnly(d);
if (d) listTextarea.$element.addClass('wa-list-running');
else listTextarea.$element.removeClass('wa-list-running');
}
function resetPanels() {
Editor.setValue('');
$titleLink.text('Page content').removeAttr('href');
$editorHeader.removeClass('wa-dirty');
setStatus('Ready');
$('#wa-summary-preview').val('');
currentTitle = null;
$visualOut.html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready...</div>');
$infoContainer.empty();
btnWatch.setDisabled(true);
btnManualEdit.setDisabled(true);
Editor.setDisabled(true);
currentPageExists = false;
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
toggleUI(false);
updateListCount();
if (autoSaveTimer) clearTimeout(autoSaveTimer);
}
function arrayMove(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) arr.push(undefined);
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
}
function updateRuleButtons() {
rulesRegistry.forEach(function(item, idx) {
item.btnUp.setDisabled(idx === 0);
item.btnDown.setDisabled(idx === rulesRegistry.length - 1);
});
}
function addRule() {
var row = $('<div>').addClass('wa-rule-row');
var controls = $('<div>').addClass('wa-rule-controls');
var btnUp = new OO.ui.ButtonWidget({
icon: 'collapse',
framed: false,
title: 'Move up',
classes: ['wa-rule-btn']
});
var btnDown = new OO.ui.ButtonWidget({
icon: 'expand',
framed: false,
title: 'Move down',
classes: ['wa-rule-btn']
});
controls.append(btnUp.$element, btnDown.$element);
var contentDiv = $('<div>').addClass('wa-rule-content');
var f = new OO.ui.TextInputWidget({
placeholder: 'Find'
});
var r = new OO.ui.TextInputWidget({
placeholder: 'Replace'
});
var reg = new OO.ui.ToggleSwitchWidget();
var fl = new OO.ui.TextInputWidget({
value: 'gmu',
disabled: true
}).toggle(false);
var btnEnable = new OO.ui.ButtonWidget({
icon: 'power',
framed: false,
title: 'Toggle rule',
flags: ['progressive']
});
var isRuleActive = true;
var btnFunc = new OO.ui.ButtonWidget({
icon: 'code',
framed: false,
title: 'Toggle JS mode',
disabled: true
});
var isRuleFunc = false;
var toggleRule = function(forceVal) {
var val = (forceVal !== undefined) ? forceVal : !isRuleActive;
isRuleActive = val;
row.css('opacity', isRuleActive ? 1 : 0.5);
if (isRuleActive) btnEnable.setFlags(['progressive']);
else btnEnable.clearFlags();
};
btnEnable.on('click', function() {
toggleRule();
});
var toggleFunc = function(forceVal) {
var val = (forceVal !== undefined) ? forceVal : !isRuleFunc;
isRuleFunc = val;
if (isRuleFunc) {
btnFunc.setFlags(['progressive']);
r.$input.attr('placeholder', 'return match.toUpperCase();');
} else {
btnFunc.clearFlags();
r.$input.attr('placeholder', 'Replace');
}
};
btnFunc.on('click', function() {
toggleFunc();
});
btnFunc.toggle(false);
reg.on('change', function(v) {
fl.setDisabled(!v);
fl.toggle(v);
btnFunc.setDisabled(!v);
if (!v) {
btnFunc.toggle(false);
if (isRuleFunc) toggleFunc(false);
} else btnFunc.toggle(true);
});
var del = new OO.ui.ButtonWidget({
icon: 'trash',
flags: 'destructive',
framed: false,
title: 'Delete rule',
});
del.on('click', function() {
row.fadeOut(200, function() {
row.remove();
rulesRegistry = rulesRegistry.filter(x => x.row !== row);
updateRuleButtons();
});
});
contentDiv.append(f.$element, $('<div>').css('margin-top', '3px').append(r.$element), $('<div>').addClass('wa-rule-opt-row').append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<span>').text('Regex: ').css({
'font-size': '0.8em',
'margin-right': '4px'
}), reg.$element, fl.$element.css({
'width': '50px',
'margin-left': '5px'
})), btnFunc.$element.css('margin-left', '10px')), $('<div>').css('display', 'flex').append(btnEnable.$element, del.$element)));
row.append(controls, contentDiv);
$rulesList.append(row);
var ruleItem = {
row: row,
find: f,
rep: r,
regex: reg,
flags: fl,
btnUp: btnUp,
btnDown: btnDown,
enable: btnEnable,
del: del,
btnFunc: btnFunc,
isActive: function() {
return isRuleActive;
},
setActive: toggleRule,
isFunc: function() {
return isRuleFunc;
},
setFunc: toggleFunc
};
rulesRegistry.push(ruleItem);
btnUp.on('click', function() {
var idx = rulesRegistry.indexOf(ruleItem);
if (idx > 0) {
var prevRow = rulesRegistry[idx - 1].row;
row.fadeOut(150, function() {
row.insertBefore(prevRow).fadeIn(150).addClass('wa-highlight');
setTimeout(function() {
row.removeClass('wa-highlight');
}, 500);
});
arrayMove(rulesRegistry, idx, idx - 1);
updateRuleButtons();
}
});
btnDown.on('click', function() {
var idx = rulesRegistry.indexOf(ruleItem);
if (idx < rulesRegistry.length - 1) {
var nextRow = rulesRegistry[idx + 1].row;
row.fadeOut(150, function() {
row.insertAfter(nextRow).fadeIn(150).addClass('wa-highlight');
setTimeout(function() {
row.removeClass('wa-highlight');
}, 500);
});
arrayMove(rulesRegistry, idx, idx + 1);
updateRuleButtons();
}
});
updateRuleButtons();
}
btnAddRule.on('click', addRule);
addRule();
togWikiTypos.on('change', function(v) {
if (v) {
if (wikiTypos.length > 0) lblWikiStatus.text(wikiTypos.length + ' rules loaded (Cached)');
else {
lblWikiStatus.text('Fetching...');
togWikiTypos.setDisabled(true);
new mw.Api().get({
action: 'query',
prop: 'revisions',
titles: mw.config.get('wgFormattedNamespaces')[4] + ':AutoWikiBrowser/Typos',
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(d) {
var page = d.query.pages[0];
if (!page.missing) {
wikiTypos = parseTypoContent(page.revisions[0].slots.main.content);
lblWikiStatus.text(wikiTypos.length + ' rules loaded');
} else {
lblWikiStatus.text('Page not found');
togWikiTypos.setValue(false);
}
}).catch(function() {
lblWikiStatus.text('Error');
togWikiTypos.setValue(false);
}).always(function() {
togWikiTypos.setDisabled(false);
});
}
} else lblWikiStatus.text('Rules inactive');
});
btnLoadLocal.on('click', function() {
$typoInput.click();
});
$typoInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
localTypos = parseTypoContent(evt.target.result);
lblLocalStatus.text(localTypos.length + ' local rules loaded');
btnClearLocal.setDisabled(false);
};
reader.readAsText(file);
$typoInput.val('');
});
btnClearLocal.on('click', function() {
localTypos = [];
lblLocalStatus.text('No local rules');
btnClearLocal.setDisabled(true);
});
btnLoadLib.on('click', function() {
$libInput.click();
});
btnRemoveLib.on('click', function() {
currentLibrary = {
name: null,
code: null
};
updateLibUI();
});
$libInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
currentLibrary = {
name: file.name,
code: evt.target.result
};
updateLibUI();
};
reader.readAsText(file);
$libInput.val('');
});
btnPower.on('click', function() {
hasNewSources = false;
checkSummaryWarning();
if (!isRunning) {
if (SAVED_SESSION === 0) mw.track('stats.mediawiki_gadget_wAwB_total');
isRunning = true;
toggleUI(true);
loadNextPage();
} else {
if (SAVED_RUN > 0) {
mw.track('stats.mediawiki_gadget_wAwB_saved_total', SAVED_RUN, {
wiki: WIKI
});
SAVED_SESSION += SAVED_RUN;
SAVED_RUN = 0;
}
isRunning = false;
toggleUI(false);
WorkerEngine.destroy();
resetPanels();
}
});
inputSummary.on('change', function() {
checkSummaryWarning();
if (currentTitle) {
updateSummaryPreview(inputSummary.getValue());
}
});
btnSkip.on('click', function() {
if (Editor.getValue() === 'Loading...') return;
removeTopLine();
loadNextPage();
});
btnDiff.on('click', function() {
currentViewMode = 'diff';
updateDirtyState();
if (currentTitle) renderDiff();
});
btnPreview.on('click', function() {
currentViewMode = 'preview';
updateDirtyState();
if (currentTitle) renderPreview();
});
btnSave.on('click', function() {
if (Editor.getValue() === 'Loading...' || !currentTitle) return;
if (autoSaveTimer) clearTimeout(autoSaveTimer);
btnSave.setDisabled(true);
setStatus('Saving...', 'working');
var effectiveDelay = PERMS.saveDelay || 0;
if (effectiveDelay > 0) setStatus('Throttling (' + (effectiveDelay / 1000) + 's)...', 'working');
setTimeout(function() {
if (effectiveDelay > 0) setStatus('Saving...', 'working');
var finalSum = $('#wa-summary-preview').val().trim();
var summary = finalSum + SUMMARY_SUFFIX;
new mw.Api().postWithToken('csrf', {
action: 'edit',
title: currentTitle,
text: Editor.getValue(),
summary: summary,
minor: chkMinor.isSelected(),
baserevid: baseRevId,
bot: PERMS.allowBot,
watchlist: 'nochange',
tags: DO_TAG ? APP_NAME : undefined
}).then(function() {
SAVED_RUN += 1;
removeTopLine();
loadNextPage();
}).catch(function(c) {
btnSave.setDisabled(false);
setStatus('Save error', 'error');
alert('Save failed: ' + c);
});
}, effectiveDelay);
});
btnManualEdit.on('click', function() {
if (Editor.getValue() === 'Loading...' || !currentTitle) return;
// Calculate the final injected summary
var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : inputSummary.getValue();
var finalSum = base + (currentPageSummaryAppend || "");
var translatedSummary = injectVars(finalSum);
var summary = translatedSummary; // no SUMMARY_SUFFIX
// Create an invisible form targeting a new tab
var $form = $('<form>').attr({
method: 'POST',
action: mw.util.getUrl(currentTitle, { action: 'edit' }),
target: '_blank'
}).hide();
// Populate it with MediaWiki's native input names
$('<textarea>').attr('name', 'wpTextbox1').val(Editor.getValue()).appendTo($form);
$('<input>').attr('name', 'wpSummary').val(summary).appendTo($form);
if (chkMinor.isSelected()) {
$('<input>').attr('name', 'wpMinoredit').val('1').appendTo($form);
}
// Append, fire, and destroy
$form.appendTo('body').submit().remove();
});
btnWatch.on('click', function() {
var isWatched = btnWatch.getIcon() === 'unStar';
new mw.Api()[isWatched ? 'unwatch' : 'watch'](currentTitle).then(function() {
btnWatch.setIcon(isWatched ? 'star' : 'unStar');
mw.notify(isWatched ? 'Unwatched' : 'Watched');
});
});
btnAdd.on('click', function() {
if (isFetching) {
isFetching = false;
btnAdd.setDisabled(true).setLabel('Cancelling...');
return;
}
try {
var mode = srcSelect.getValue(),
q = srcInput.getValue().trim();
if (mode !== 'watchlist' && mode !== 'usercontribs' && mode !== 'pageswithprop' && !q) {
alert('Query empty');
return;
}
var nsIds = ($nsSelect.val() || []).map(v => parseInt(v));
var nsStr = nsIds.join('|');
var api = new mw.Api(),
promises = [];
if (mode === 'cat') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'categorymembers',
cmtitle: mw.Title.newFromText(q, 14) ? mw.Title.newFromText(q, 14).getPrefixedText() : 'Category:' + q,
cmnamespace: nsStr,
cmtype: (chkCatPages.isSelected() ? 'page|' : '') + (chkCatSub.isSelected() ? 'subcat|' : '') + (chkCatFile.isSelected() ? 'file' : ''),
cmlimit: 'max'
}));
else if (mode === 'linksto') {
if (chkLinkWiki.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'backlinks',
bltitle: q,
blnamespace: nsStr,
bllimit: 'max',
blfilterredir: dropLinkRedir.getValue(),
blredirect: chkLinkToRedir.isSelected()
}));
if (chkLinkTrans.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'embeddedin',
eititle: q,
einamespace: nsStr,
eilimit: 'max',
eifilterredir: dropLinkRedir.getValue()
}));
if (chkLinkImg.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'imageusage',
iutitle: q,
iunamespace: nsStr,
iulimit: 'max',
iufilterredir: dropLinkRedir.getValue()
}));
} else if (mode === 'linkson') promises.push(fetchWithContinue(api, {
action: 'query',
generator: 'links',
titles: q,
gplnamespace: nsStr,
gpllimit: 'max',
prop: 'info'
}));
else if (mode === 'prefix') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'allpages',
apprefix: q,
apnamespace: nsIds[0] || 0,
aplimit: 'max'
}));
else if (mode === 'watchlist') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'watchlistraw',
wrnamespace: nsStr,
wrlimit: 'max'
}));
else if (mode === 'search') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'search',
srsearch: q,
srnamespace: nsStr,
srlimit: 'max'
}));
else if (mode === 'usercontribs') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'usercontribs',
ucuser: srcInputUser.getValue(),
ucstart: srcInputStartDate.getValue(),
ucend: srcInputEndDate.getValue(),
ucdir: 'newer',
uclimit: 'max',
ucnamespace: nsStr,
ucprop: 'title'
}));
else if (mode === 'pageswithprop') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'pageswithprop',
pwppropname: srcDropProp.getValue(),
pwplimit: 'max'
}));
Promise.all(promises).then(function(res) {
var list = new Set();
res.forEach(titles => titles.forEach(t => list.add(t)));
var currentVal = listTextarea.getValue();
var newVal = Array.from(list).join('\n');
listTextarea.setValue(currentVal ? currentVal + '\n' + newVal : newVal);
mw.notify('Added ' + list.size + ' pages');
}).catch(e => alert('Error: ' + e));
} catch (e) {
alert("Fetch error: " + e);
}
});
btnSort.on('click', function() {
var v = listTextarea.getValue();
if (v) {
var lines = getNormalizedList(v);
lines.sort((a, b) => sortAsc ? a.localeCompare(b) : b.localeCompare(a));
listTextarea.setValue(lines.join('\n'));
sortAsc = !sortAsc;
}
});
btnDedup.on('click', function() {
var v = listTextarea.getValue();
if (v) listTextarea.setValue(getDeduplicatedList(v).join('\n'));
});
btnClear.on('click', function() {
listTextarea.setValue('');
});
btnSaveProj.on('click', function() {
try {
var currentMode = srcSelect.getValue();
if (['watchlist', 'usercontribs', 'pageswithprop'].indexOf(currentMode) === -1) queryCache[currentMode] = srcInput.getValue();
var saveExcludes = {};
for (var k in protCheckboxes) saveExcludes[k] = protCheckboxes[k].isSelected();
var data = {
version: APP_VERSION,
library: currentLibrary,
source: {
activeMode: currentMode,
namespaces: ($nsSelect.val() || []).map(v => parseInt(v)),
modes: {
cat: {
query: queryCache['cat'] || '',
options: {
pages: chkCatPages.isSelected(),
sub: chkCatSub.isSelected(),
file: chkCatFile.isSelected()
}
},
linksto: {
query: queryCache['linksto'] || '',
options: {
wiki: chkLinkWiki.isSelected(),
trans: chkLinkTrans.isSelected(),
img: chkLinkImg.isSelected(),
redir: dropLinkRedir.getValue(),
toRedir: chkLinkToRedir.isSelected()
}
},
linkson: {
query: queryCache['linkson'] || ''
},
prefix: {
query: queryCache['prefix'] || ''
},
watchlist: {
query: ''
},
search: {
query: queryCache['search'] || ''
},
usercontribs: {
options: {
user: srcInputUser.getValue(),
start: srcInputStartDate.getValue(),
end: srcInputEndDate.getValue()
}
},
pageswithprop: {
options: {
prop: srcDropProp.getValue()
}
}
}
},
settings: {
redir: redirMode.findSelectedItem().getData(),
skipLogic: radSkipExist.findSelectedItem().getData(),
skipNoChange: chkSkipNoChange.isSelected(),
minor: chkMinor.isSelected()
},
filters: {
contains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
notContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
},
categories: {
skip: inpSkipCategories.getValue(),
require: inpSkipNotCategories.getValue()
}
},
rules: rulesRegistry.map(r => ({
find: r.find.getValue(),
replace: r.rep.getValue(),
regex: r.regex.getValue(),
flags: r.flags.getValue(),
enabled: r.isActive(),
isFunc: r.isFunc()
})),
scripts: {
pre: txtPreScript.getValue(),
post: txtPostScript.getValue()
},
processing: {
summary: inputSummary.getValue(),
list: listTextarea.getValue()
},
protection: {
mode: dropProtMode.getValue(),
excludes: saveExcludes,
target: (radTargetSet.findSelectedItem() || {
getData: () => null
}).getData(),
templateFilter: inpTemplateFilter.getValue()
}
};
var a = document.createElement('a');
a.href = URL.createObjectURL(new Blob([JSON.stringify(data, null, 1)], {
type: "application/json"
}));
a.download = "wawb_project.json";
a.click();
} catch (e) {
alert("Save error: " + e);
}
});
btnLoadProj.on('click', function() {
$fileInput.click();
});
$fileInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
try {
var data = JSON.parse(evt.target.result);
isLoadingProject = true;
if (data.source) {
if (data.source.namespaces) $nsSelect.val(data.source.namespaces.map(String));
if (data.source.modes) {
var m = data.source.modes;
queryCache = {};
for (var key in m)
if (m[key].query !== undefined) queryCache[key] = m[key].query;
if (m.cat && m.cat.options) {
chkCatPages.setSelected(m.cat.options.pages);
chkCatSub.setSelected(m.cat.options.sub);
chkCatFile.setSelected(m.cat.options.file);
}
if (m.linksto && m.linksto.options) {
chkLinkWiki.setSelected(m.linksto.options.wiki);
chkLinkTrans.setSelected(m.linksto.options.trans);
chkLinkImg.setSelected(m.linksto.options.img);
dropLinkRedir.setValue(m.linksto.options.redir);
chkLinkToRedir.setSelected(m.linksto.options.toRedir);
}
if (m.usercontribs && m.usercontribs.options) {
srcInputUser.setValue(m.usercontribs.options.user);
srcInputStartDate.setValue(m.usercontribs.options.start);
srcInputEndDate.setValue(m.usercontribs.options.end);
}
if (m.pageswithprop && m.pageswithprop.options) srcDropProp.setValue(m.pageswithprop.options.prop);
}
if (data.source.activeMode) {
srcSelect.setValue(data.source.activeMode);
isLoadingProject = false;
srcSelect.emit('change', data.source.activeMode);
isLoadingProject = true;
}
}
if (data.settings) {
redirMode.selectItemByData(data.settings.redir);
chkSkipNoChange.setSelected(data.settings.skipNoChange);
radSkipExist.selectItemByData(data.settings.skipLogic);
if (data.settings.minor !== undefined) chkMinor.setSelected(data.settings.minor);
}
if (data.protection) {
dropProtMode.setValue(data.protection.mode);
for (var k in data.protection.excludes)
if (protCheckboxes[k]) protCheckboxes[k].setSelected(data.protection.excludes[k]);
if (data.protection.target) radTargetSet.selectItemByData(data.protection.target);
if (data.protection.templateFilter) inpTemplateFilter.setValue(data.protection.templateFilter);
}
if (data.library) {
currentLibrary = data.library;
updateLibUI();
}
if (data.filters) {
inpSkipContains.setValue(data.filters.contains.val);
togSkipContainsRegex.setValue(data.filters.contains.regex);
inpSkipNotContains.setValue(data.filters.notContains.val);
togSkipNotContainsRegex.setValue(data.filters.notContains.regex);
}
if (data.filters.categories) {
inpSkipCategories.setValue(data.filters.categories.skip);
inpSkipNotCategories.setValue(data.filters.categories.require);
}
rulesRegistry.forEach(r => r.row.remove());
rulesRegistry = [];
$rulesList.empty();
if (data.rules) data.rules.forEach(r => {
addRule();
var last = rulesRegistry[rulesRegistry.length - 1];
last.find.setValue(r.find);
last.rep.setValue(r.replace);
last.regex.setValue(r.regex);
last.flags.setValue(r.flags);
last.flags.setDisabled(!r.regex);
last.setActive(r.enabled);
if (r.isFunc) last.setFunc(true);
});
if (rulesRegistry.length === 0) addRule();
if (data.scripts) {
txtPreScript.setValue(data.scripts.pre);
txtPostScript.setValue(data.scripts.post);
}
if (data.processing) {
inputSummary.setValue(data.processing.summary);
listTextarea.setValue(data.processing.list);
}
isLoadingProject = false;
setStatus('Project loaded');
} catch (err) {
alert("Error: " + err);
}
$fileInput.val('');
};
reader.readAsText(file);
});
if (CAN_MOVE || IS_ADMIN) {
togAdminEnable.on('change', function(val) {
if (!currentTitle) {
updateInterfaceMode();
return;
}
if (val) {
Editor.setValue(originalWikitext);
updateInterfaceMode();
renderDiff();
setStatus('Ready (Page actions)');
} else processPageContent();
});
}
if (CAN_MOVE) {
btnAdminMove.on('click', function() {
if (!currentVars['$xA']) {
mw.notify('Variable $xA not set', {
type: 'error'
});
return;
}
new mw.Api().postWithToken('csrf', {
action: 'move',
from: currentTitle,
to: currentVars['$xA'],
reason: inputSummary.getValue() + SUMMARY_SUFFIX,
movetalk: chkMovTalk.isSelected(),
movesubpages: chkMovSub.isSelected(),
noredirect: chkMovRedirect.isSelected()
}).then(function() {
removeTopLine();
loadNextPage();
}).catch(e => alert('Move failed: ' + e));
});
}
if (IS_ADMIN) {
btnAdminDel.on('click', function() {
new mw.Api().postWithToken('csrf', {
action: 'delete',
title: currentTitle,
reason: inputSummary.getValue() + SUMMARY_SUFFIX
}).then(function() {
if (chkDelTalk.isSelected()) new mw.Api().postWithToken('csrf', {
action: 'delete',
title: mw.Title.newFromText(currentTitle).getTalkPage().getPrefixedText(),
reason: 'Talk page of deleted page'
});
removeTopLine();
loadNextPage();
}).catch(e => alert('Delete failed: ' + e));
});
btnAdminProt.on('click', function() {
var protections = [];
if (dropProtEdit.getValue()) protections.push('edit=' + dropProtEdit.getValue());
if (dropProtMove.getValue()) protections.push('move=' + dropProtMove.getValue());
new mw.Api().postWithToken('csrf', {
action: 'protect',
title: currentTitle,
protections: protections.join('|'),
expiry: inpProtExpiry.getValue() || 'infinite',
reason: inputSummary.getValue() + SUMMARY_SUFFIX
}).then(function() {
removeTopLine();
loadNextPage();
}).catch(e => alert('Protect failed: ' + e));
});
}
Editor.init();
resetPanels();
});
$(window).on('beforeunload', function() {
return "You have unsaved work.";
});
}).catch(e => console.error("wAwB Loader Error:", e));
//</nowiki>
7aca73a1vt43dj8ot4md3zzce9zs93t
747802
747801
2026-06-21T03:46:14Z
Ponor
47975
throw 'assertuserfailed' when logged-out
747802
javascript
text/javascript
/*
* wAwB – An in-browser application for automated editing of wiki pages.
* Features: customizable regex or JavaScript search-and-replace rules,
* custom JavaScript pre/post-processing functions and function libraries,
* granular protection or targeting of different parts of wikitext,
* a full-fledged CodeMirror editor, and options to move, delete, and protect pages.
* Author: [[User:Ponor]]
* Documentation: [[User:Ponor/wAwB]]
* License: GNU General Public License (GPL)
*/
//<nowiki>
mw.loader.using([
'oojs-ui-core',
'oojs-ui-widgets',
'oojs-ui-windows',
'mediawiki.api',
'mediawiki.diff.styles',
'mediawiki.util',
'mediawiki.page.gallery.styles',
'oojs-ui.styles.icons-content',
'oojs-ui.styles.icons-interactions',
'oojs-ui.styles.icons-movement',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-editing-core',
'oojs-ui.styles.icons-editing-advanced'
]).then(function() {
// =====================================================================
// 1. STATE & CONFIGURATION
// =====================================================================
var SCRIPT_TIMEOUT_MS = window.wa_timeout || 5000;
var FETCH_SAFETY_LIMIT = window.wa_fetchLimit || 10000;
var APP_NAME = "wAwB";
var DO_TAG = false;
var SUMMARY_SUFFIX = window.wa_suffix || " [[:en:User:Ponor/wAwB| #wAwB]]";
var APP_VERSION = "0.6";
var DOC_URL = window.wa_docUrl || "https://en.wikipedia.org/wiki/User:Ponor/wAwB";
document.title = window.wa_editIn || "Edit in wAwB";
var PERMS = {
canSave: false,
allowBot: false,
saveDelay: 0
};
var IS_ADMIN = mw.config.get('wgUserGroups').includes('sysop');
var CAN_MOVE = IS_ADMIN || mw.config.get('wgUserGroups').includes('extendedmover') || mw.config.get('wgUserGroups').includes('filemover') || mw.config.get('wgUserGroups').includes('pagemover');
var WIKI = mw.config.get('wgDBname');
var SAVED_RUN = 0;
var SAVED_SESSION = 0;
var currentPageExists = false;
var isRunning = false;
var isFetching = false;
var currentTitle = null;
var currentVars = {};
var currentLibrary = {
name: null,
code: null
};
var originalWikitext = "";
var currentPageSummaryAppend = "";
var currentPageSummaryOverride = null;
var baseRevId = 0;
var currentViewMode = 'diff';
var autoSaveTimer = null;
var propNamesLoaded = false;
var hasNewSources = false;
var currentHeightMode = 1; // 0=25%, 1=45% (default), 2=72%
var heightValues = ['25%', '45%', '72%'];
// EXTERNAL RULES STATE
var wikiTypos = [];
var localTypos = [];
// LOADING FLAG
var isLoadingProject = false;
// NAMESPACE ALIASES
var nsIds = mw.config.get('wgNamespaceIds');
var catAliases = [],
fileAliases = [];
for (var key in nsIds) {
if (nsIds[key] === 14) catAliases.push(key.replace(/_/g, ' '));
if (nsIds[key] === 6) fileAliases.push(key.replace(/_/g, ' '));
}
catAliases.sort((a, b) => b.length - a.length);
fileAliases.sort((a, b) => b.length - a.length);
var REGEX_CAT_PFX = catAliases.map(mw.util.escapeRegExp).join('|');
var REGEX_FILE_PFX = fileAliases.map(mw.util.escapeRegExp).join('|');
// MASTER PROTECTION DEFINITIONS
var PROTECTION_DEFS = [{
id: 'nowiki',
isOn: true,
label: 'Nowiki: <nowiki>',
regex: /<nowiki>[\s\S]*?<\/nowiki>|<nowiki\s*\/>/gi
},
{
id: 'comments',
isOn: true,
label: 'Comments: <!' + '-- -->',
regex: new RegExp('<!' + '--[\\s\\S]*?--' + '>', 'g')
},
{
id: 'headers',
isOn: false,
label: 'Headers: == Title ==',
regex: /^==+[\s\S]+?==+\s*$/gm
},
{
id: 'templates',
isOn: false,
label: 'Templates: {{...}}',
open: '{{',
close: '}}',
species: null,
regex: null
},
{
id: 'tables',
isOn: false,
label: 'Tables: {|...|}',
open: '\n{|',
close: '\n|}',
regex: null
},
{
id: 'images',
isOn: false,
label: 'Images: [[File:...|...|...]]',
open: '[[',
close: ']]',
species: '(?:' + REGEX_FILE_PFX + ')\\s*:',
regex: null
},
{
id: 'refs',
isOn: true,
label: 'Refs: <ref...',
regex: /<ref[^>]*?\/>|<ref[^>]*?(?<!\/)>[\s\S]*?<\/ref>/gi
},
{
id: 'blocks',
isOn: false,
label: 'Blocks: math, gallery...',
regex: null
},
{
id: 'categories',
isOn: true,
label: 'Categories: [[Category:...]]',
regex: new RegExp('\\[\\[\\s*(' + REGEX_CAT_PFX + ')\\s*:[^\\]]+\\]\\]', 'giu')
},
{
id: 'files',
isOn: true,
label: 'File names: File:...',
regex: new RegExp('(?<=\\[\\[\\s*:?(:?' + REGEX_FILE_PFX + ')\\s*:)[^|\\]]+' + '|^\\s*(?:' + REGEX_FILE_PFX + ')\\s*:([^\\][}{|\\n]{1,150}\\.(?:svg|png|jpe?g|gif|tiff|webp|xcf|mp3|midi|ogg|webm|flac|wav|mpe?g|pdf|djv))', 'gmiu')
},
{
id: 'targets',
isOn: false,
label: 'Targets of [[...|',
regex: /(?<=\[\[:?)[^|\]]+?(?=\||\]\])/g
},
{
id: 'extlinks',
isOn: true,
label: 'External links: [...]',
regex: /(?<=\[)(https?:\/\/|ftps?:\/\/|mailto:)[^\]]+(?=\])/gi
},
{
id: 'urls',
isOn: true,
label: 'URLs: http...',
regex: /https?:\/\/[^\s<>[\]"'`()]+/gi
}
];
// =====================================================================
// 2. CSS STYLES
// =====================================================================
var styles = `
* { box-sizing: border-box; }
#wa-root { font-family: sans-serif; height: 100vh; width: 100vw; overflow: hidden; display: flex; font-size: 14px; }
#wa-left-panel { width: 400px; min-width: 400px; max-width: 400px; background: var(--background-color-base, #fff); border-right: 1px solid #c8ccd1; display: flex; flex-direction: column; z-index: 10; overflow-x: hidden; }
#wa-left-panel h3 { color: #3f6fcf; text-align: center; margin: 12px 0 0 0; }
#wa-username { color: #3f6fcf; text-align: center; margin: 2px 0; font-size: 92%; }
#wa-content-area { flex: 1; padding: 10px 10px 100px 10px; overflow-y: auto; overflow-x: hidden; }
#wa-right-panel { flex: 1; display: flex; flex-direction: column; height: 100%; background: var(--background-color-interactive, #eaecf0); overflow: hidden; }
#wa-visual-output { flex: 0 0 45%; min-height: 0; overflow-y: auto; background: var(--background-color-base, #fff); padding: 20px; border-bottom: 1px solid #c8ccd1; }
.wa-editor-header { flex: 0 0 40px; min-height: 40px; padding: 0 10px; background: var(--background-color-interactive-subtle, #f8f9fa); border-bottom: 1px solid #c8ccd1; display: flex; gap: 25px; justify-content: space-between; align-items: center; z-index: 10; }
.wa-editor-header.wa-dirty { background: var(--background-color-warning-subtle, #fdf2d5); border-bottom: 1px solid #e6a700; }
.wa-header-left { flex: 1; display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; }
.wa-header-right { flex: 0 0 auto; display: flex; justify-content: flex-end; align-items: center; gap: 8px; color: var(--color-placeholder, #72777d); font-size: 0.9em; }
.wa-title-link { font-weight: bold; font-size: 1.1em; color: var(--color-progressive--focus, #36c) !important; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 40%; }
.wa-title-link:hover { text-decoration: underline; }
#wa-status-indicator { flex: 0 0 auto; width: 10px; height: 10px; border-radius: 50%; background-color: #00af89; cursor: help; transition: background-color 0.2s; margin-right: 2px; }
#wa-status-indicator.wa-status-working { background-color: #36c; animation: wa-pulse-blue 1.5s infinite; }
#wa-status-indicator.wa-status-error { background-color: #bf3c2c; }
@keyframes wa-pulse-blue { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } }
.wa-header-sep { border-left: 1px solid #ccc; height: 16px; flex-shrink: 0; margin: 0 2px; }
#wa-summary-preview { flex-grow: 1; color: #d00; font-style: italic; white-space: nowrap; text-overflow: ellipsis; overflow-x: auto; background: transparent; border: none; outline: none; box-shadow: none; min-width: 50px; padding: 2px 5px; scrollbar-width: none; -ms-overflow-style: none; font-size: 1em; }
#wa-summary-preview::-webkit-scrollbar { display: none; }
#wa-summary-preview:hover { background: rgba(0, 0, 0, 0.05); cursor: text; }
#wa-summary-preview:focus { background: #fff; }
.wa-info-container { margin-right: 10px; }
.wa-tools-container { display: flex; align-items: center; gap: 2px; }
.wa-resize-container { display: flex; flex-direction: column; justify-content: center; height: 100%; margin-left: 10px; padding-left: 5px; border-left: 1px solid #ccc; }
.wa-resize-btn { cursor: pointer; color: #72777d; user-select: none; width: 20px; height: 14px; display: flex; align-items: center; justify-content: center; transition: color 0.1s ease-in-out; }
.wa-resize-btn:hover { color: #36c; }
.wa-resize-btn.wa-resize-disabled { color: #ccc; cursor: default; }
#wa-proc-header { margin-top: 15px !important; border-bottom: none !important; cursor: default; }
#wa-proc-title { font-weight: bold; padding: 10px; display: block; }
#wa-proc-content { padding: 0 10px 15px 10px; }
#wa-editor-area { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--background-color-base, #fff); position: relative; overflow: hidden; }
#wa-editor-textarea { flex: 1; height: 100%; font-family: monospace; font-size: 13px; border: none; outline: none; padding: 10px; resize: none; width: 100%; }
.cm-editor { height: 100% !important; flex: 1; }
.wa-section-header { margin-top: 12px; border-bottom: 1px solid #eee; width: 100%; display: block; margin-left: 0 !important; }
#wa-content-area .wa-section-header:first-child, #wa-content-area .wa-section-header.oo-ui-buttonElement-frameless:first-child { margin-top: 0; margin-left: 0 !important; }
.wa-section-header > .oo-ui-buttonElement-button { text-align: left; padding: 10px 10px !important; margin: 0 !important; display: block; width: 100%; position: relative; border-left: 3px solid #3f6fcf !important; border-radius: 3px !important; background-color: transparent !important; }
.wa-section-header > .oo-ui-buttonElement-button:focus { outline: none !important; }
.wa-section-header .oo-ui-labelElement-label { font-weight: bold; padding-left: 0 !important; margin-left: 0 !important; color: var(--color-base, #202122); }
.wa-section-header .oo-ui-indicatorElement-indicator { position: absolute; right: 10px !important; top: 50%; margin-top: -10px; left: auto !important; width: 20px; }
.wa-foldable-content { display: none; padding: 10px 0; }
.wa-source-options { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; border-top: none; padding: 8px; margin-bottom: 10px; font-size: 0.9em; }
.wa-opt-row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 5px; }
.wa-opt-label { font-weight: bold; width: 100%; margin-bottom: 5px; color: var(--color-base, #202122); }
.wa-opt-row > div { margin-top: 8px !important; margin-bottom: 8px !important; }
.wa-rule-row { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; padding: 8px; margin-bottom: 8px; border-radius: 4px; display: flex; align-items: stretch; transition: background-color 0.3s; }
.wa-rule-row.wa-highlight { background-color: var(--background-color-interactive, #eaecf0); border-color: #36c; }
.wa-rule-controls { display: flex; flex-direction: column; justify-content: center; gap: 0px; padding-right: 4px; border-right: 1px solid #eee; margin-right: 8px; }
.wa-rule-btn { margin: 0 !important; margin-right: 0 !important; margin-left: 0 !important; }
.wa-rule-btn > .oo-ui-buttonElement-button { margin: 0 !important; }
.wa-rule-content { flex: 1; min-width: 0; }
.wa-rule-opt-row { display: flex; justify-content: space-between; align-items: center; margin-top: 5px; }
#wa-ns-selector { width: 100%; margin-bottom: 10px; font-family: sans-serif; font-size: 0.9em; border: 1px solid #a2a9b1; }
.wa-lib-dialog > .oo-ui-window-frame { width: 80vw !important; max-width: none !important; height: 80vh !important; max-height: none !important; }
.wa-lib-editorwrapper { height: 100%; border: 1px solid #c8ccd1; position: relative; boxSizing: border-box; }
.wa-page-list-raw textarea { font-family: monospace; font-size: 0.9em; white-space: pre; overflow-x: auto; }
.wa-list-running textarea { background-color: var(--background-color-neutral-subtle, #f8f8f8) !important; color: var(--color-base, #202122) !important; }
.wa-grid-container { display: flex; gap: 6px; margin-bottom: 10px; }
.wa-grid-col { flex: 1; display: flex; flex-direction: column; gap: 6px; }
.wa-grid-col .oo-ui-buttonWidget { width: 100%; }
.wa-grid-col .oo-ui-buttonWidget .oo-ui-buttonElement-button { width: 100%; text-align: center; justify-content: center; }
.wa-toolbar { display: flex; justify-content: flex-end; align-items: center; gap: 4px; border-bottom: 1px solid #eee; padding-bottom: 4px; margin-bottom: 4px; }
.wa-list-counter { margin-right: auto; font-weight: bold; color: var(--color-subtle, #54595d); font-size: 0.9em; padding-left: 5px; }
.wa-project-bar { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 10px; margin: 8px 0; justify-content: center; }
.wa-project-bar .oo-ui-buttonElement-button { padding-left: 36px !important; padding-right: 12px !important; font-size: 0.9em; }
.wa-project-bar .oo-ui-iconElement-icon { left: 10px !important; }
.wa-settings-header { font-weight: bold; color: var(--color-subtle, #54595d); margin-bottom: 8px; display: block; text-transform: uppercase; font-size: 0.9em; }
.wa-setting-row { display: flex; align-items: center; margin-bottom: 6px; }
.wa-bot-row { background: var(--background-color-success-subtle, #dff2eb); border: 1px solid #a5d6a7; padding: 8px; margin-bottom: 10px; border-radius: 4px; display: flex; align-items: center; justify-content: flex-start; gap: 15px; }
table.diff { width: 100%; font-family: "Adwaita Mono", "Courier New", monospace }
table.diff td { vertical-align: top; }
table.diff tr:hover td { background-color: var(--background-color-progressive-subtle--hover, #d9e2ff); cursor: pointer; }
@keyframes wa-pulse-red { 0% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0.4); border-color: #ff0000; } 70% { box-shadow: 0 0 0 6px rgba(255, 0, 0, 0); border-color: #ff0000; } 100% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0); border-color: #ff0000; } }
.wa-summary-warning input { animation: wa-pulse-red 1s infinite; border-color: #ff0000 !important; }
`;
$('<style>').text(styles).appendTo('head');
$('body').empty();
// =====================================================================
// 3. HELPER FUNCTIONS
// =====================================================================
function checkPermissions() {
return new Promise(function(resolve) {
var api = new mw.Api();
var projectNs = mw.config.get('wgFormattedNamespaces')[4];
var checkTitles = {
'permissions': projectNs + ':AutoWikiBrowser/CheckPageJSON',
'tag': 'MediaWiki:Tag-wAwB'
};
api.get({
action: 'query',
prop: 'revisions',
titles: Object.values(checkTitles).join('|'),
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(data) {
var pagePerms = data.query.pages.find(p => p.title === checkTitles['permissions']);
var pageTag = data.query.pages.find(p => p.title === checkTitles['tag']);
DO_TAG = pageTag.missing === undefined;
var userName = mw.config.get('wgUserName');
var userGroups = mw.config.get('wgUserGroups');
var isSysop = userGroups.includes('sysop');
if (!pagePerms.missing) {
try {
var content = pagePerms.revisions[0].slots.main.content;
var json = JSON.parse(content);
var inEnabledUsers = json.enabledusers && json.enabledusers.includes(userName);
var inEnabledBots = json.enabledbots && json.enabledbots.includes(userName);
var isBotGroup = userGroups.includes('bot');
var canSave = inEnabledUsers || inEnabledBots || isSysop;
var allowBot = inEnabledBots && isBotGroup;
resolve({
canSave: canSave,
allowBot: allowBot,
saveDelay: 0
});
} catch (e) {
resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
}
} else {
var editCount = mw.config.get('wgUserEditCount');
if (editCount > 500) resolve({
canSave: true,
allowBot: false,
saveDelay: 20000
});
else resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
}
}).catch(function() {
resolve({
canSave: false,
allowBot: false,
saveDelay: 0
});
});
});
}
function getUserCode(widget, globalName) {
var val = widget.getValue().trim();
if (!val || val.startsWith('// Enter')) {
if (window[globalName] && typeof window[globalName] === 'function') {
var s = window[globalName].toString();
return s.substring(s.indexOf('{') + 1, s.lastIndexOf('}'));
}
return "";
}
if (val.startsWith('function')) {
return val.substring(val.indexOf('{') + 1, val.lastIndexOf('}'));
}
return val;
}
function normalizeLine(line) {
if (!line) return null;
// Pass through comments/STOP commands (trimmed)
if (line.trim().startsWith('####')) return line.trim();
// Handle Title|Variables
var parts = line.split('|');
var title = parts[0].trim();
if (!title) return null; // Skip if title is empty
// Reassemble: Clean Title + Original Variables (preserving whitespace)
var rest = parts.length > 1 ? parts.slice(1).join('|') : null;
return title + (rest !== null ? '|' + rest : '');
}
function getNormalizedList(text) {
if (!text) return [];
return text.split('\n')
.map(normalizeLine)
.filter(function(l) {
return l !== null;
});
}
function getDeduplicatedList(text) {
if (!text) return [];
var seen = new Set();
var out = [];
var lines = text.split('\n');
for (var i = 0; i < lines.length; i++) {
var clean = normalizeLine(lines[i]);
if (clean && !seen.has(clean)) {
seen.add(clean);
out.push(clean);
}
}
return out;
}
function parseTypoContent(content) {
if (!content) return [];
try {
var $wrapper = $('<body>').html(content);
var rules = [];
$wrapper.find('Typo:not([disabled])').each(function() {
var $t = $(this);
var find = $t.attr('find');
var replace = $t.attr('replace');
if (find && replace !== undefined) {
rules.push({
find: find,
replace: replace,
regex: true,
flags: 'gmu',
enabled: true,
isFunc: false
});
}
});
return rules;
} catch (e) {
return [];
}
}
function updateSummaryPreview(baseText) {
var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : (baseText || "");
var finalSum = base + (currentPageSummaryAppend || "");
var previewText = finalSum ? injectVars(finalSum) : '';
$('#wa-summary-preview').val(previewText);
}
function injectVars(text) {
if (!text) return "";
return text.replace(/\$x([A-Z]|x)/g, function(match) {
return currentVars[match] || match; // Swap it, or leave it alone if undefined
});
}
// =====================================================================
// 4. UI CONSTRUCTION
// =====================================================================
checkPermissions().then(function(pState) {
PERMS = pState;
var $main = $('<div>').attr('id', 'wa-root').appendTo('body');
var $left = $('<div>').attr('id', 'wa-left-panel').appendTo($main);
$left.append($('<h3>').append($('<a>').attr('href', DOC_URL).attr('target', '_blank').text(APP_NAME).css({
'text-decoration': 'none',
'color': 'inherit'
})));
$left.append($('<div>').attr('id', 'wa-username').append($('<a>').attr('href', mw.util.getUrl('Special:Contributions/' + mw.config.get('wgUserName'))).attr('target', '_blank').text('User: ' + mw.config.get('wgUserName')).css({
'text-decoration': 'none',
'color': 'inherit'
})));
var btnSaveProj = new OO.ui.ButtonWidget({
icon: 'download',
label: 'Save project',
framed: false,
flags: 'progressive'
});
var btnLoadProj = new OO.ui.ButtonWidget({
icon: 'upload',
label: 'Load project',
framed: false
});
var $projBar = $('<div>').addClass('wa-project-bar').append(btnSaveProj.$element, btnLoadProj.$element);
$left.append($projBar);
var $fileInput = $('<input type="file" accept=".json">').hide().appendTo('body');
var $content = $('<div>').attr('id', 'wa-content-area').appendTo($left);
var $right = $('<div>').attr('id', 'wa-right-panel').appendTo($main);
var $editorHeader = $('<div>').addClass('wa-editor-header').appendTo($right);
var $headerLeft = $('<div>').addClass('wa-header-left').appendTo($editorHeader);
var $statusIndicator = $('<span>').attr('id', 'wa-status-indicator').attr('title', 'Ready').appendTo($headerLeft);
var $titleLink = $('<a>').addClass('wa-title-link').text('Page content').attr('target', '_blank').appendTo($headerLeft);
$('<span>').addClass('wa-header-sep').appendTo($headerLeft);
var $summaryPreview = $('<input type="text">').attr('id', 'wa-summary-preview').attr('autocomplete', 'off').appendTo($headerLeft);
var $headerRight = $('<div>').addClass('wa-header-right').appendTo($editorHeader);
var $infoContainer = $('<span>').addClass('wa-info-container').appendTo($headerRight);
var $toolsContainer = $('<div>').addClass('wa-tools-container').appendTo($headerRight);
var $resizeContainer = $('<div>').addClass('wa-resize-container').appendTo($headerRight);
var $adminTools = $('<div>').addClass('wa-admin-tools').hide().appendTo($toolsContainer);
// Wide chevron SVGs
var svgUp = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 10 L12 2 L22 10" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>';
var svgDown = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 2 L12 10 L22 2" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>';
var $btnSizeUp = $('<div>').addClass('wa-resize-btn').html(svgUp).attr('title', 'Decrease view size');
var $btnSizeDown = $('<div>').addClass('wa-resize-btn').html(svgDown).attr('title', 'Increase view size');
$resizeContainer.append($btnSizeUp, $btnSizeDown);
function setPanelHeight(modeIndex) {
currentHeightMode = modeIndex;
if (currentHeightMode < 0) currentHeightMode = 0;
if (currentHeightMode > 2) currentHeightMode = 2;
$('#wa-visual-output').css('flex-basis', heightValues[currentHeightMode]);
$btnSizeUp.toggleClass('wa-resize-disabled', currentHeightMode === 0);
$btnSizeDown.toggleClass('wa-resize-disabled', currentHeightMode === 2);
}
$btnSizeUp.on('click', function() {
if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode - 1);
});
$btnSizeDown.on('click', function() {
if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode + 1);
});
setPanelHeight(1);
if (CAN_MOVE) {
var btnAdminMove = new OO.ui.ButtonWidget({
icon: 'move',
title: 'Move page to $xA',
disabled: true,
framed: false
});
$adminTools.append(btnAdminMove.$element).show();
}
if (IS_ADMIN) {
var btnAdminDel = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Delete page',
disabled: true,
framed: false
});
var btnAdminProt = new OO.ui.ButtonWidget({
icon: 'lock',
title: 'Protect page',
disabled: true,
framed: false
});
$adminTools.append(btnAdminDel.$element, btnAdminProt.$element).show();
}
var btnManualEdit = new OO.ui.ButtonWidget({
icon: 'edit',
title: 'Open in manual editor',
framed: false,
disabled: true
});
var btnWatch = new OO.ui.ButtonWidget({
icon: 'star',
title: 'Watch this page',
framed: false,
disabled: true,
accessKey: 'w'
});
$toolsContainer.append(btnManualEdit.$element, btnWatch.$element);
var $visualOut = $('<div>').attr('id', 'wa-visual-output').html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready to start...</div>').prependTo($right);
var $editorArea = $('<div>').attr('id', 'wa-editor-area').appendTo($right);
var $textArea = $('<textarea>').attr('id', 'wa-editor-textarea').attr('placeholder', 'Page text will appear here...').appendTo($editorArea);
function setStatus(msg, type) {
if (!msg) msg = "Ready";
$statusIndicator.attr('title', msg).removeClass('wa-status-error wa-status-working');
if (type === 'error') $statusIndicator.addClass('wa-status-error');
if (type === 'working') $statusIndicator.addClass('wa-status-working');
}
// EDITOR OBJECT
var Editor = {
mode: 'textarea',
cmInstance: null,
init: function() {
var self = this;
mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.mode.mediawiki']).then(function(require) {
try {
self.cmInstance = new(require('ext.CodeMirror'))($textArea[0], (require('ext.CodeMirror.mode.mediawiki')).mediawiki());
self.cmInstance.initialize();
self.mode = 'codemirror';
} catch (e) {
console.error("CM Error", e);
}
}).catch(function(err) {
console.error("CM Load Error:", err);
});
$textArea.on('input', updateDirtyState);
},
getValue: function() {
return (this.mode === 'codemirror' && this.cmInstance) ? this.cmInstance.view.state.doc.toString() : $textArea.val();
},
setValue: function(text) {
$textArea.val(text);
if (this.mode === 'codemirror' && this.cmInstance) {
this.cmInstance.view.dispatch({
changes: {
from: 0,
to: this.cmInstance.view.state.doc.length,
insert: text
}
});
} else {
$textArea[0].dispatchEvent(new Event('input'));
}
},
setDisabled: function(d) {
$textArea.prop('disabled', d);
if (this.mode === 'codemirror' && this.cmInstance) {
this.cmInstance.view.contentDOM.contentEditable = !d;
$($textArea).parent().find('.cm-editor').css('opacity', d ? 0.5 : 1);
}
},
scrollToLine: function(n) {
if (isNaN(n)) return;
if (this.mode === 'codemirror' && this.cmInstance) {
var v = this.cmInstance.view;
var l = v.state.doc.line(n);
v.dispatch({
effects: v.constructor.scrollIntoView(l.from, {
y: 'center'
}),
selection: {
anchor: l.from
}
});
v.focus();
}
}
};
var WorkerEngine = {
activeWorker: null,
workerURL: null,
currentLibCode: null,
timeoutTimer: null,
initWorker: function(libCode) {
this.destroy(); // Clean up existing if any
this.currentLibCode = libCode || "";
var scriptContent = this.currentLibCode + "\n\n" + `
self.onmessage = async function(e) {
try {
var data = e.data;
var inputs = data.texts || [data.text];
var vars = data.vars;
var outputs = [];
// Helper to construct async functions dynamically
var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
function inject(str) {
if (!str) return "";
return str.replace(/\\$x([A-Z]|x)/g, function(m) { return vars[m] || ""; });
}
// Returns a Promise and handles 'await' inside user code
async function execUserFunc(code, currentText, currentVars, sharedObj) {
if (!code || code.trim() === "") return currentText;
try {
var func = new AsyncFunction('text', 'vars', 'shared', code);
var res = await func(currentText, currentVars, sharedObj);
if (res && typeof res === 'object' && res.skip) {
return { _skipSignal: true, reason: res.reason || 'Script-requested skip' };
}
return (res !== undefined) ? res : currentText;
} catch (err) {
throw err; // or: return currentText
}
}
var shared = {}; // Shared context for this page
for (var i = 0; i < inputs.length; i++) {
var text = inputs[i];
// 1. Pre-Process
var preRes;
if (data.preCode && data.preCode.trim() !== "") {
preRes = await execUserFunc(data.preCode, text, vars, shared);
} else if (typeof wAwB_Pre === 'function') {
try {
preRes = await wAwB_Pre(text, vars, shared);
if (preRes && typeof preRes === 'object' && preRes.skip) {
preRes = { _skipSignal: true, reason: preRes.reason || 'Script-requested skip' };
}
} catch (err) { preRes = text; }
} else {
preRes = text;
}
if (preRes && preRes._skipSignal) {
self.postMessage({ skipped: true, reason: preRes.reason });
return;
}
text = (preRes !== undefined) ? preRes : text;
// 2. Rules Processing
if (data.rules && data.rules.length > 0) {
data.rules.forEach(function(rule) {
var findStr = inject(rule.find);
if (!findStr) return;
if (rule.isFunc) {
try {
var userFunc = new Function('match', 'groups', 'vars', 'shared', rule.replace);
text = text.replace(new RegExp(findStr, (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '')), function(...args) {
var match = args[0];
var groups = args.slice(1, -2);
try {
var res = userFunc(match, groups, vars, shared);
return res !== undefined ? res : match;
} catch (err) { return match; }
});
} catch (e) {}
} else {
var repStr = inject(rule.replace).replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r");
if (rule.regex) {
try {
var flags = (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '');
text = text.replace(new RegExp(findStr, flags), repStr);
} catch (e) {}
} else {
var finalFind = findStr.replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r");
text = text.split(finalFind).join(repStr);
}
}
});
}
// 3. Post-Process
var postRes;
if (data.postCode && data.postCode.trim() !== "") {
postRes = await execUserFunc(data.postCode, text, vars, shared);
} else if (typeof wAwB_Post === 'function') {
try {
postRes = await wAwB_Post(text, vars, shared);
if (postRes && typeof postRes === 'object' && postRes.skip) {
postRes = { _skipSignal: true, reason: postRes.reason || 'Script-requested skip' };
}
} catch (err) { postRes = text; }
} else {
postRes = text;
}
if (postRes && postRes._skipSignal) {
self.postMessage({ skipped: true, reason: postRes.reason });
return;
}
text = (postRes !== undefined) ? postRes : text;
outputs.push(text);
}
self.postMessage({ success: true, texts: outputs, summaryAppend: shared.summaryAppend, summaryOverride: shared.summaryOverride });
} catch (err) { self.postMessage({ success: false, error: err.toString() }); }
};
`;
var blob = new Blob([scriptContent], {
type: 'application/javascript'
});
this.workerURL = URL.createObjectURL(blob);
this.activeWorker = new Worker(this.workerURL);
},
run: function(payload) {
var self = this;
return new Promise(function(resolve, reject) {
// Re-init if no worker exists, or if the user changed the library code
if (!self.activeWorker || self.currentLibCode !== (payload.libraryCode || "")) {
self.initWorker(payload.libraryCode);
}
if (self.timeoutTimer) clearTimeout(self.timeoutTimer);
self.timeoutTimer = setTimeout(function() {
self.destroy(); // Assassinate the stuck worker
reject("Script timed out (" + SCRIPT_TIMEOUT_MS + "ms).");
}, SCRIPT_TIMEOUT_MS);
self.activeWorker.onmessage = function(e) {
clearTimeout(self.timeoutTimer);
if (e.data.skipped) resolve({
skipped: true,
reason: e.data.reason
});
else if (e.data.success) resolve({
success: true,
texts: e.data.texts,
summaryAppend: e.data.summaryAppend,
summaryOverride: e.data.summaryOverride
});
else reject(e.data.error);
};
self.activeWorker.postMessage(payload);
});
},
destroy: function() {
if (this.activeWorker) {
this.activeWorker.terminate();
this.activeWorker = null;
}
if (this.workerURL) {
URL.revokeObjectURL(this.workerURL);
this.workerURL = null;
}
if (this.timeoutTimer) {
clearTimeout(this.timeoutTimer);
this.timeoutTimer = null;
}
}
};
var PageProtector = {
store: [],
getKey: function() {
var id = this.store.length.toString();
var p = "";
for (var i = 0; i < id.length; i++) {
p += String.fromCharCode(0xE010 + parseInt(id[i]));
}
return '\uE000' + p + '\uE001';
},
protect: function(text, mode, config, templateSpecies = null) {
this.store = [];
var self = this;
var safeRep = function(t, r) {
return t.replace(r, function(m) {
if (!m) return m;
var key = self.getKey();
self.store.push(m);
return key;
});
};
var shouldProcess = function(id) {
if (mode === 'target') return config === id;
return config[id] === true;
};
var matchedBrackets = function(text, op, cl, species = '') {
var newText = "",
depth = 0,
start = 0,
cursor = 0;
var speciesRegex = species ? new RegExp(species, 'iu') : null;
for (var i = 0; i < text.length; i++) {
if (text[i] === op[0] && text.slice(i, i + op.length) === op) {
if (depth === 0) start = i;
depth++;
i += op.length - 1;
} else if (text[i] === cl[0] && text.slice(i, i + cl.length) === cl) {
if (depth > 0) {
depth--;
if (depth === 0) {
var chunk = text.substring(start, i + cl.length);
if (!speciesRegex || speciesRegex.test(chunk)) {
var key = self.getKey();
self.store.push(chunk);
newText += text.substring(cursor, start) + key;
} else {
newText += text.substring(cursor, i + cl.length);
}
cursor = i + cl.length;
}
i += cl.length - 1;
}
}
}
newText += text.substring(cursor);
return newText;
};
PROTECTION_DEFS.forEach(function(def) {
if (shouldProcess(def.id)) {
if (def.id === 'blocks') {
['math', 'pre', 'source', 'syntaxhighlight', 'code', 'gallery'].forEach(t => text = safeRep(text, new RegExp('<' + t + '[^>]*?>[\\s\\S]*?<\\/' + t + '>|<' + t + '[^>]*?/>', 'gi')));
} else if (['templates', 'tables', 'images'].includes(def.id)) {
var activeSpecies = (def.id === 'templates') ? templateSpecies : def.species;
text = matchedBrackets(text, def.open, def.close, activeSpecies || '');
} else if (def.regex) {
text = safeRep(text, def.regex);
}
}
});
return text;
},
restore: function(text) {
var self = this;
var loop = 100;
while (/(\uE000[\uE010-\uE019]+\uE001)/.test(text) && loop > 0) {
text = text.replace(/\uE000([\uE010-\uE019]+)\uE001/g, function(m, d) {
var id = "";
for (var i = 0; i < d.length; i++) id += (d.charCodeAt(i) - 0xE010).toString();
return self.store[parseInt(id, 10)] || m;
});
loop--;
}
return text;
}
};
var accordionRegistry = [];
function addSection(title, $inner) {
var btn = new OO.ui.ButtonWidget({
label: title,
indicator: 'down',
framed: false,
classes: ['wa-section-header']
});
var box = $('<div>').addClass('wa-foldable-content').append($inner);
var sectionObj = {
btn: btn,
box: box,
label: title
};
accordionRegistry.push(sectionObj);
btn.on('click', function() {
var isOpening = !box.is(':visible');
if (isOpening) {
accordionRegistry.forEach(function(sec) {
if (sec !== sectionObj) {
sec.box.hide();
sec.btn.setIndicator('down');
}
});
}
box.toggle();
btn.setIndicator(box.is(':visible') ? 'up' : 'down');
});
$content.append(btn.$element, box);
return sectionObj;
}
// WIDGETS
var srcSelect = new OO.ui.DropdownInputWidget({
options: [{
data: 'cat',
label: 'Category'
}, {
data: 'linksto',
label: 'Pages linking to...'
}, {
data: 'linkson',
label: 'Links on page...'
}, {
data: 'prefix',
label: 'Pages with prefix...'
}, {
data: 'watchlist',
label: 'Watchlist'
}, {
data: 'search',
label: 'Wiki search'
}, {
data: 'usercontribs',
label: 'User contributions'
}, {
data: 'pageswithprop',
label: 'Pages with property'
}]
});
var srcInput = new OO.ui.TextInputWidget({
placeholder: 'Category...'
});
var now = new Date();
var today = now.toISOString().split('T')[0];
var srcInputUser = new OO.ui.TextInputWidget({
placeholder: 'Username'
});
var srcInputStartDate = new OO.ui.TextInputWidget({
value: today + 'T00:00:00',
placeholder: 'ISO start date'
});
var srcInputEndDate = new OO.ui.TextInputWidget({
value: today + 'T23:59:59',
placeholder: 'ISO end date'
});
var srcDropProp = new OO.ui.DropdownInputWidget({
options: []
});
var $optContainer = $('<div>').addClass('wa-source-options').hide();
var $optCat = $('<div>').hide();
var $optUser = $('<div>').hide();
var $optProp = $('<div>').hide();
var chkCatPages = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkCatSub = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkCatFile = new OO.ui.CheckboxInputWidget({
selected: false
});
$optCat.append($('<div>').addClass('wa-opt-label').text('Include:'), new OO.ui.FieldLayout(chkCatPages, {
label: 'Pages',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkCatSub, {
label: 'Subcats',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkCatFile, {
label: 'Files',
align: 'inline'
}).$element);
$optUser.append(new OO.ui.FieldLayout(srcInputUser, {
label: 'User',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInputStartDate, {
label: 'Start (Older)',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInputEndDate, {
label: 'End (Newer)',
align: 'top'
}).$element);
$optProp.append(new OO.ui.FieldLayout(srcDropProp, {
label: 'Property',
align: 'top'
}).$element);
var $optLinks = $('<div>').hide();
var chkLinkWiki = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkLinkTrans = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkLinkImg = new OO.ui.CheckboxInputWidget({
selected: false
});
var dropLinkRedir = new OO.ui.DropdownInputWidget({
options: [{
data: 'nonredirects',
label: 'No redirects'
}, {
data: 'all',
label: 'Both'
}, {
data: 'redirects',
label: 'Redirects only'
}]
});
var chkLinkToRedir = new OO.ui.CheckboxInputWidget({
selected: false
});
$optLinks.append($('<div>').addClass('wa-opt-label').text('What to include:'), $('<div>').addClass('wa-opt-row').append(new OO.ui.FieldLayout(chkLinkWiki, {
label: 'Wikilinks',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkLinkTrans, {
label: 'Transclusions',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkLinkImg, {
label: 'File usage',
align: 'inline'
}).$element), $('<div>').addClass('wa-opt-label').text('Redirects:'), dropLinkRedir.$element, new OO.ui.FieldLayout(chkLinkToRedir, {
label: 'Include links to redirects',
align: 'inline'
}).$element);
$optContainer.append($optCat, $optLinks, $optUser, $optProp);
var queryCache = {};
var lastMode = 'cat';
srcSelect.on('change', function(newMode) {
if (!isLoadingProject) {
if (lastMode !== 'watchlist' && lastMode !== 'usercontribs' && lastMode !== 'pageswithprop') {
queryCache[lastMode] = srcInput.getValue();
}
}
$optContainer.hide();
$optCat.hide();
$optLinks.hide();
$optUser.hide();
$optProp.hide();
srcInput.setDisabled(false).$element.show();
if (newMode === 'cat') {
$optContainer.show();
$optCat.show();
} else if (newMode === 'linksto') {
$optContainer.show();
$optLinks.show();
} else if (newMode === 'usercontribs') {
$optContainer.show();
$optUser.show();
srcInput.setDisabled(true).$element.hide();
} else if (newMode === 'pageswithprop') {
$optContainer.show();
$optProp.show();
srcInput.setDisabled(true).$element.hide();
if (!propNamesLoaded) {
new mw.Api().get({
action: 'query',
list: 'pagepropnames',
ppnlimit: 'max'
}).then(function(d) {
if (d.query && d.query.pagepropnames) {
srcDropProp.setOptions(d.query.pagepropnames.map(p => ({
data: p.propname,
label: p.propname
})));
propNamesLoaded = true;
}
});
}
}
if (newMode === 'watchlist') {
srcInput.setValue('');
srcInput.setDisabled(true);
srcInput.$input.attr('placeholder', '(No query needed)');
} else if (newMode !== 'usercontribs' && newMode !== 'pageswithprop') {
srcInput.setValue(queryCache[newMode] || '');
var ph = 'Query...';
if (newMode === 'cat') ph = 'Category name';
if (newMode === 'search') ph = 'Search query...';
if (newMode === 'prefix') ph = 'Page prefix...';
if (newMode === 'linksto') ph = 'Pages linking to this title...';
if (newMode === 'linkson') ph = 'Get links from this page...';
srcInput.$input.attr('placeholder', ph);
}
lastMode = newMode;
});
srcSelect.emit('change', srcSelect.getValue());
var $nsSelect = $('<select>').attr('id', 'wa-ns-selector').attr('multiple', 'multiple').attr('size', '8');
var nsMap = mw.config.get('wgFormattedNamespaces');
for (var id in nsMap) {
if (parseInt(id) >= 0) $nsSelect.append($('<option>').val(id).text(id + ': ' + (nsMap[id] || '(Main)')));
}
$nsSelect.val(['0']);
var btnAdd = new OO.ui.ButtonWidget({
label: 'Add to list',
icon: 'add',
flags: ['primary', 'progressive']
});
var $btnRow = $('<div>').css({
'display': 'flex',
'justify-content': 'flex-end',
'margin-top': '10px'
});
var $fetchStatus = $('<span>').css({
'margin-right': '10px',
'color': '#888',
'font-size': '0.9em',
'align-self': 'center'
}).hide();
$btnRow.append($fetchStatus, btnAdd.$element);
addSection('Source', $('<div>').append(new OO.ui.FieldLayout(srcSelect, {
label: 'Mode',
align: 'top'
}).$element, new OO.ui.FieldLayout(srcInput, {
label: 'Query',
align: 'top'
}).$element, $optContainer, $('<div>').text('Namespaces:').css({
'font-weight': 'bold',
'margin-top': '5px'
}), $nsSelect, $btnRow));
var redirMode = new OO.ui.RadioSelectWidget({
items: [new OO.ui.RadioOptionWidget({
data: 'edit',
label: 'Edit the redirect page (Default)'
}), new OO.ui.RadioOptionWidget({
data: 'follow',
label: 'Follow redirect (Edit target)'
}), new OO.ui.RadioOptionWidget({
data: 'skip',
label: 'Skip redirects'
})]
});
redirMode.selectItemByData('edit');
var radSkipExist = new OO.ui.RadioSelectWidget({
items: [new OO.ui.RadioOptionWidget({
data: 'none',
label: 'Process all'
}), new OO.ui.RadioOptionWidget({
data: 'missing',
label: 'Skip if page does not exist'
}), new OO.ui.RadioOptionWidget({
data: 'exists',
label: 'Skip if page exists'
})]
});
radSkipExist.selectItemByData('none');
var chkSkipNoChange = new OO.ui.CheckboxInputWidget({
selected: false
});
var inpSkipContains = new OO.ui.TextInputWidget({
placeholder: 'Text/Regex for Skip if FOUND'
});
var togSkipContainsRegex = new OO.ui.ToggleSwitchWidget({
value: false,
title: 'Use regex'
});
var inpSkipNotContains = new OO.ui.TextInputWidget({
placeholder: 'Text/Regex for Skip if MISSING'
});
var togSkipNotContainsRegex = new OO.ui.ToggleSwitchWidget({
value: false,
title: 'Use regex'
});
var inpSkipCategories = new OO.ui.TextInputWidget({
placeholder: 'Skip if in: Category1|Category2'
});
var inpSkipNotCategories = new OO.ui.TextInputWidget({
placeholder: 'Skip if NOT in: Category1|Category2'
});
var $settingsPanel = $('<div>')
.append($('<span>').addClass('wa-settings-header').text('Redirects'))
.append(redirMode.$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Skip logic'))
.append(new OO.ui.FieldLayout(chkSkipNoChange, {
label: 'Skip if no changes made',
align: 'inline'
}).$element.css('margin-bottom', '8px'))
.append(radSkipExist.$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Content filters'))
.append($('<div>').addClass('wa-setting-row').append(inpSkipContains.$element.css('flex', 1), togSkipContainsRegex.$element.css('margin-left', '5px')))
.append($('<div>').addClass('wa-setting-row').append(inpSkipNotContains.$element.css('flex', 1), togSkipNotContainsRegex.$element.css('margin-left', '5px')))
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($('<span>').addClass('wa-settings-header').text('Category filters'))
.append(new OO.ui.FieldLayout(inpSkipCategories, {
label: 'Blacklist',
align: 'top'
}).$element)
.append(new OO.ui.FieldLayout(inpSkipNotCategories, {
label: 'Whitelist',
align: 'top'
}).$element);
addSection('Skip', $settingsPanel);
var dropProtMode = new OO.ui.DropdownInputWidget({
options: [{
data: 'protect',
label: 'Protect (Exclude)'
}, {
data: 'target',
label: 'Target (Edit Matches Only)'
}]
});
var inpTemplateFilter = new OO.ui.TextInputWidget({
placeholder: 'Regex: infobox rail line|railway'
});
var $templateFilterLayout = new OO.ui.FieldLayout(inpTemplateFilter, {
label: 'Template filter',
align: 'top'
});
var $protList = $('<div>');
var protCheckboxes = {};
PROTECTION_DEFS.forEach(function(def) {
var chk = new OO.ui.CheckboxInputWidget({
selected: def.isOn
});
protCheckboxes[def.id] = chk;
$protList.append(new OO.ui.FieldLayout(chk, {
label: def.label,
align: 'inline'
}).$element);
});
var targetRadioItems = PROTECTION_DEFS.map(function(def) {
return new OO.ui.RadioOptionWidget({
data: def.id,
label: def.label
});
});
var radTargetSet = new OO.ui.RadioSelectWidget({
items: targetRadioItems
});
var $targetList = $('<div>').hide().append(radTargetSet.$element);
dropProtMode.on('change', function(mode) {
if (mode === 'protect') {
$protList.show();
$targetList.hide();
} else {
$protList.hide();
$targetList.show();
}
});
addSection('Protection', $('<div>').addClass('wa-source-options')
.append(new OO.ui.FieldLayout(dropProtMode, {
label: 'Mode',
align: 'top'
}).$element)
.append($('<hr>').css('border-top', '1px solid #eee'))
.append($protList).append($targetList)
.append($('<div style="margin-top:10px;">').append($templateFilterLayout.$element))
);
var $rulesList = $('<div>');
var btnAddRule = new OO.ui.ButtonWidget({
label: 'Add rule',
icon: 'add'
});
var rulesRegistry = [];
addSection('Rules', $('<div>').append($rulesList, btnAddRule.$element));
var togWikiTypos = new OO.ui.ToggleSwitchWidget({
value: false
});
var lblWikiStatus = $('<div>').css({
'font-size': '0.9em',
'color': '#888',
'margin-top': '2px'
});
var btnLoadLocal = new OO.ui.ButtonWidget({
icon: 'upload',
label: 'Load file',
framed: false
});
var btnClearLocal = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Clear local',
framed: false,
flags: 'destructive',
disabled: true
});
var lblLocalStatus = $('<div>').text('No local rules').css({
'font-size': '0.9em',
'color': '#888',
'margin-top': '2px'
});
var $typoInput = $('<input type="file">').hide().appendTo('body');
var $extRulesPanel = $('<div>').addClass('wa-source-options');
$extRulesPanel.append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'justify-content': 'space-between'
}).append($('<span>').text('Project:AutoWikiBrowser/Typos').css('font-weight', 'bold'), togWikiTypos.$element),
$('<div>').css('margin-bottom', '10px').append(lblWikiStatus),
$('<hr>').css('border-top', '1px solid #eee'),
$('<div>').append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<span>').text('Local rules (session only)').css({
'font-weight': 'bold'
}), $('<div>').css('flex', '1'), btnLoadLocal.$element, btnClearLocal.$element), lblLocalStatus)
);
addSection('External rules', $extRulesPanel);
var txtPreScript = new OO.ui.MultilineTextInputWidget({
rows: 6,
value: '',
placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;'
});
var txtPostScript = new OO.ui.MultilineTextInputWidget({
rows: 6,
value: '',
placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;'
});
var btnLoadLib = new OO.ui.ButtonWidget({
icon: 'upload',
title: 'Load library (.js)',
framed: false
});
var btnRemoveLib = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Remove library',
framed: false,
flags: 'destructive'
});
var txtLibStatus = new OO.ui.TextInputWidget({
value: '(No library loaded)',
readOnly: true
});
var $libInput = $('<input type="file" accept=".js">').hide().appendTo('body');
var btnEditLib = new OO.ui.ButtonWidget({
icon: 'edit',
label: 'Edit project library',
framed: false
});
var $scriptPanel = $('<div>').append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'gap': '5px',
'margin-bottom': '10px'
}).append($('<span>').text('JS library:').css({
'font-weight': 'bold',
'white-space': 'nowrap'
}), txtLibStatus.$element.css('flex', '1'), btnLoadLib.$element, btnRemoveLib.$element),
$('<div>').css({
'display': 'flex',
'justify-content': 'flex-end',
'margin-bottom': '10px'
}).append(btnEditLib.$element),
new OO.ui.FieldLayout(txtPreScript, {
label: 'Pre-Process',
align: 'top'
}).$element,
new OO.ui.FieldLayout(txtPostScript, {
label: 'Post-Process',
align: 'top'
}).$element
);
addSection('Scripts', $scriptPanel);
function updateLibUI() {
if (currentLibrary.code) {
txtLibStatus.setValue(currentLibrary.name);
btnRemoveLib.setDisabled(false);
} else {
txtLibStatus.setValue('(No library loaded)');
btnRemoveLib.setDisabled(true);
}
}
updateLibUI();
function LibraryEditorDialog(config) {
LibraryEditorDialog.super.call(this, config);
}
OO.inheritClass(LibraryEditorDialog, OO.ui.ProcessDialog);
LibraryEditorDialog.static.name = 'libraryEditor';
LibraryEditorDialog.static.title = 'Edit project library';
LibraryEditorDialog.static.actions = [{
action: 'save',
label: 'Save',
flags: ['primary', 'progressive']
},
{
label: 'Cancel',
flags: 'safe'
}
];
LibraryEditorDialog.prototype.initialize = function() {
LibraryEditorDialog.super.prototype.initialize.call(this);
this.$element.addClass('wa-lib-dialog'); // Attach our custom CSS override class
this.panel = new OO.ui.PanelLayout({
padded: true,
expanded: true
});
this.$editorWrapper = $('<div>').addClass('wa-lib-editorwrapper');
this.panel.$element.append(this.$editorWrapper);
this.$body.append(this.panel.$element);
};
LibraryEditorDialog.prototype.getSetupProcess = function(data) {
data = data || {};
return LibraryEditorDialog.super.prototype.getSetupProcess.call(this, data)
.next(function() {
var self = this;
self.$editorWrapper.empty();
// Create a textarea for the MediaWiki CM wrapper to properly bind to
var $libTextArea = $('<textarea>').appendTo(self.$editorWrapper);
var initCode = currentLibrary.code || "// All custom library functions defined here will be passed to the worker.\n// Special functions:\n// function wAwB_Pre(text, vars, shared) { return text; }\n// function wAwB_Post(text, vars, shared) { return text; }\n";
return mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.modes']).then(function(require) {
var CM = require('ext.CodeMirror');
var modes = require('ext.CodeMirror.modes');
self.cmInstance = new CM($libTextArea[0], modes.javascript());
self.cmInstance.initialize();
self.cmInstance.view.dispatch({
changes: {
from: 0,
insert: initCode
}
});
// Force CodeMirror to fill the wrapper
self.$editorWrapper.find('.cm-editor').css({
height: '100%'
});
}).catch(function(err) {
console.error("wAwB CM Init Error:", err);
});
}, this);
};
LibraryEditorDialog.prototype.getActionProcess = function(action) {
var dialog = this;
if (action === 'save') {
return new OO.ui.Process(function() {
var newCode = "";
if (dialog.cmInstance) {
newCode = dialog.cmInstance.view.state.doc.toString();
}
if (newCode.trim() === "") {
currentLibrary = {
name: null,
code: null
};
} else {
currentLibrary.code = newCode;
currentLibrary.name = "custom code";
}
updateLibUI();
dialog.close({
action: action
});
});
}
if (action === 'cancel' || !action) {
return new OO.ui.Process(function() {
dialog.close({
action: action
});
});
}
return LibraryEditorDialog.super.prototype.getActionProcess.call(this, action);
};
LibraryEditorDialog.prototype.getTeardownProcess = function(data) {
return LibraryEditorDialog.super.prototype.getTeardownProcess.call(this, data)
.next(function() {
if (this.cmInstance) {
try {
this.cmInstance.view.destroy();
} catch (e) {}
this.cmInstance = null;
}
}, this);
};
var windowManager = new OO.ui.WindowManager();
$('body').append(windowManager.$element);
var libDialog = new LibraryEditorDialog();
windowManager.addWindows([libDialog]);
btnEditLib.on('click', function() {
windowManager.openWindow(libDialog);
});
var togAdminEnable = new OO.ui.ToggleSwitchWidget({
value: false
});
var chkMovRedirect = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkMovTalk = new OO.ui.CheckboxInputWidget({
selected: true
});
var chkMovSub = new OO.ui.CheckboxInputWidget({
selected: false
});
var chkDelTalk = new OO.ui.CheckboxInputWidget({
selected: true
});
var dropProtEdit = new OO.ui.DropdownInputWidget({
options: [{
data: '',
label: '(No Change)'
}, {
data: 'all',
label: 'All'
}, {
data: 'autoconfirmed',
label: 'Autoconfirmed'
}, {
data: 'sysop',
label: 'Sysop'
}]
});
var dropProtMove = new OO.ui.DropdownInputWidget({
options: [{
data: '',
label: '(No Change)'
}, {
data: 'all',
label: 'All'
}, {
data: 'autoconfirmed',
label: 'Autoconfirmed'
}, {
data: 'sysop',
label: 'Sysop'
}]
});
var inpProtExpiry = new OO.ui.TextInputWidget({
placeholder: 'infinite / 2 days / 12 hours'
});
if (CAN_MOVE || IS_ADMIN) {
var $adminPanel = $('<div>').append(
$('<div>').css({
'display': 'flex',
'align-items': 'center',
'justify-content': 'flex-start',
'gap': '10px'
}).append($('<span>').text('Enable page actions').css('font-weight', 'bold'), togAdminEnable.$element),
$('<hr>')
);
if (CAN_MOVE) {
$adminPanel.append(
$('<strong>').text('Move options:'), new OO.ui.FieldLayout(chkMovRedirect, {
label: 'Do not create redirect',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkMovTalk, {
label: 'Move talk page',
align: 'inline'
}).$element, new OO.ui.FieldLayout(chkMovSub, {
label: 'Move subpages',
align: 'inline'
}).$element, $('<br>')
);
}
if (IS_ADMIN) {
$adminPanel.append(
$('<strong>').text('Delete options:'), new OO.ui.FieldLayout(chkDelTalk, {
label: 'Delete talk page',
align: 'inline'
}).$element, $('<br>'),
$('<strong>').text('Protect options:'), new OO.ui.FieldLayout(dropProtEdit, {
label: 'Edit level',
align: 'top'
}).$element, new OO.ui.FieldLayout(dropProtMove, {
label: 'Move level',
align: 'top'
}).$element, new OO.ui.FieldLayout(inpProtExpiry, {
label: 'Expiry',
align: 'top'
}).$element
);
}
addSection('Page actions', $adminPanel);
}
var btnPower = new OO.ui.ButtonWidget({
label: 'Start',
icon: 'power',
flags: ['primary', 'progressive'],
title: 'Start editing',
accessKey: 'a'
});
var btnDiff = new OO.ui.ButtonWidget({
label: 'Diff',
icon: 'update',
title: 'Show diff',
accessKey: 'd'
});
var btnSkip = new OO.ui.ButtonWidget({
label: 'Next',
icon: 'next',
title: 'Skip to next page',
accessKey: 'n',
disabled: true
});
var btnPreview = new OO.ui.ButtonWidget({
label: 'Preview',
icon: 'article',
title: 'Preview page',
accessKey: 'p'
});
var btnSave = new OO.ui.ButtonWidget({
label: 'Save',
icon: 'upload',
flags: 'progressive',
title: 'Save edit',
accessKey: 's',
disabled: true
});
var inputSummary = new OO.ui.TextInputWidget({
placeholder: '',
value: '',
title: 'Enter edit summary',
accessKey: 'b'
});
var $sumLayout = new OO.ui.FieldLayout(inputSummary, {
label: 'Edit summary',
align: 'top'
}).$element;
$sumLayout.css('margin-bottom', '6px');
var listTextarea = new OO.ui.MultilineTextInputWidget({
rows: 15,
classes: ['wa-page-list-raw']
});
var btnSort = new OO.ui.ButtonWidget({
icon: 'sortVertical',
title: 'Sort list',
framed: false
});
var btnDedup = new OO.ui.ButtonWidget({
icon: 'funnel',
title: 'Remove duplicates',
framed: false
});
var btnClear = new OO.ui.ButtonWidget({
icon: 'trash',
title: 'Clear list',
framed: false
});
var btnPreParse = new OO.ui.ButtonWidget({
label: 'Pre-parse',
title: 'Process list in background',
icon: 'robot',
framed: false
});
var $listCounter = $('<span>').addClass('wa-list-counter').text('0 pages');
var togAutoSave = new OO.ui.ToggleSwitchWidget({
value: false
});
var txtAutoDelay = new OO.ui.TextInputWidget({
value: '10'
});
var $botRow = $('<div>').addClass('wa-bot-row').hide();
if (PERMS.allowBot) {
$botRow.show().append($('<span>').css('font-weight', 'bold').text('Bot mode: '), togAutoSave.$element, $('<span>').text('Delay (s):'), txtAutoDelay.$element.css('max-width', '40px'));
togAutoSave.on('change', function(v) {
if (v) txtAutoDelay.setValue('10');
});
}
var sortAsc = true;
var $procHeader = $('<div>').addClass('wa-section-header').attr('id', 'wa-proc-header').css({
'display': 'flex',
'justify-content': 'space-between',
'align-items': 'center'
});
var $procTitle = $('<span>').attr('id', 'wa-proc-title').text('Processing');
var chkMinor = new OO.ui.CheckboxInputWidget({
selected: true,
title: 'Minor edit'
});
var $minorLayout = new OO.ui.FieldLayout(chkMinor, {
label: 'm',
align: 'inline',
title: 'Minor edit'
});
$minorLayout.$element.css({
'margin-right': '15px',
'font-weight': 'normal'
});
$procHeader.append($procTitle, $minorLayout.$element);
var $procContent = $('<div>').attr('id', 'wa-proc-content').append(
$sumLayout, $botRow,
$('<div>').addClass('wa-grid-container').append(
$('<div>').addClass('wa-grid-col').append(btnPower.$element),
$('<div>').addClass('wa-grid-col').append(btnDiff.$element, btnSkip.$element),
$('<div>').addClass('wa-grid-col').append(btnPreview.$element, btnSave.$element)
),
$('<div>').addClass('wa-toolbar').append($listCounter, btnSort.$element, btnDedup.$element, btnClear.$element),
listTextarea.$element,
$('<div>').css({
'margin-top': '5px'
}).append(btnPreParse.$element)
);
$content.append($procHeader, $procContent);
var configWidgets = [
srcSelect, srcInput, srcInputUser, srcInputStartDate, srcInputEndDate, srcDropProp,
chkCatPages, chkCatSub, chkCatFile, chkLinkWiki, chkLinkTrans, chkLinkImg, dropLinkRedir, chkLinkToRedir,
btnAdd, redirMode, chkSkipNoChange, radSkipExist,
inpSkipContains, togSkipContainsRegex, inpSkipNotContains, togSkipNotContainsRegex, inpSkipCategories, inpSkipNotCategories,
dropProtMode, radTargetSet, inpTemplateFilter, btnAddRule,
txtPreScript, txtPostScript, chkMovRedirect, chkMovTalk, chkMovSub, chkDelTalk, dropProtEdit, dropProtMove, inpProtExpiry,
togWikiTypos, btnLoadLocal, btnClearLocal, btnPreParse
];
// =====================================================================
// 5. FUNCTION DEFINITIONS (Core Logic)
// =====================================================================
function checkSummaryWarning() {
var val = inputSummary.getValue();
var isBlank = !val || val.trim() === "";
if (isBlank || hasNewSources) inputSummary.$element.addClass('wa-summary-warning');
else inputSummary.$element.removeClass('wa-summary-warning');
}
function renderCurrentView() {
if (currentViewMode === 'preview') renderPreview();
else renderDiff();
}
function toggleConfig(isLocked) {
configWidgets.forEach(function(w) {
if (w instanceof OO.ui.TextInputWidget || w instanceof OO.ui.MultilineTextInputWidget) {
w.setReadOnly(isLocked);
w.$element.css('opacity', isLocked ? 0.8 : 1);
} else {
w.setDisabled(isLocked);
}
});
$nsSelect.prop('disabled', isLocked);
for (var key in protCheckboxes) protCheckboxes[key].setDisabled(isLocked);
rulesRegistry.forEach(function(r) {
r.find.setReadOnly(isLocked);
r.rep.setReadOnly(isLocked);
r.regex.setDisabled(isLocked);
r.flags.setReadOnly(isLocked);
r.enable.setDisabled(isLocked);
r.del.setDisabled(isLocked);
r.btnFunc.setDisabled(isLocked || !r.regex.getValue());
r.btnUp.setDisabled(isLocked || rulesRegistry.indexOf(r) === 0);
r.btnDown.setDisabled(isLocked || rulesRegistry.indexOf(r) === rulesRegistry.length - 1);
});
if (CAN_MOVE || IS_ADMIN) togAdminEnable.setDisabled(isLocked);
btnLoadLib.setDisabled(isLocked);
btnRemoveLib.setDisabled(isLocked || !currentLibrary.code);
btnEditLib.setDisabled(isLocked);
btnLoadLocal.setDisabled(isLocked);
btnClearLocal.setDisabled(isLocked || localTypos.length === 0);
}
function updateListCount() {
var val = listTextarea.getValue();
var count = val.trim() ? val.split('\n').filter(function(l) {
var line = l.trim();
return line !== "" && !line.startsWith("####");
}).length : 0;
$listCounter.text(count + ' pages');
}
listTextarea.on('change', updateListCount);
function updateDirtyState() {
if (isRunning && currentTitle && Editor.getValue() !== originalWikitext) $editorHeader.addClass('wa-dirty');
else $editorHeader.removeClass('wa-dirty');
}
function removeTopLine() {
var l = listTextarea.getValue().split('\n');
l.shift();
listTextarea.setValue(l.join('\n'));
updateListCount();
}
function updateInterfaceMode() {
var isAdminMode = togAdminEnable.getValue();
var pageLoaded = !!currentTitle;
btnSave.setDisabled(isAdminMode || !pageLoaded || !PERMS.canSave);
btnSkip.setDisabled(!pageLoaded);
btnPreview.setDisabled(!pageLoaded);
btnDiff.setDisabled(isAdminMode || !pageLoaded);
Editor.setDisabled(isAdminMode || !pageLoaded);
if (CAN_MOVE) {
var allowAdmin = isAdminMode && currentPageExists;
btnAdminMove.setDisabled(!(allowAdmin && currentVars['$xA']));
if (currentVars['$xA']) btnAdminMove.setTitle('Move page to ' + currentVars['$xA']);
else btnAdminMove.setTitle('Move page to $xA (Variable not set)');
}
if (IS_ADMIN) {
var allowAdmin = isAdminMode && currentPageExists;
btnAdminDel.setDisabled(!allowAdmin);
btnAdminProt.setDisabled(!allowAdmin);
}
}
function renderDiff() {
$visualOut.html('<div style="color:#888; text-align:center;">Generating Diff...</div>');
var currentText = Editor.getValue();
new mw.Api().post({
'action': 'compare',
fromtitle: currentTitle,
toslots: 'main',
'totext-main': currentText,
slots: 'main',
topst: window.wa_diffPST ? true : undefined,
prop: 'diff',
formatversion: 2
}).then(function(data) {
var diffBody = data.compare && data.compare.bodies && data.compare.bodies.main;
if (diffBody) {
$visualOut.html('<h4>Diff: ' + currentTitle + '</h4><table class="diff"><colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup><tbody>' + diffBody + '</tbody></table>');
processDiffTable();
} else {
$visualOut.html('<div style="color:green; text-align:center; padding-top:20px;">No Changes detected</div>');
}
});
}
function processDiffTable() {
var rightLineNum = 0;
$visualOut.find('table.diff tr').each(function() {
var $tr = $(this);
var $linenos = $tr.find('td.diff-lineno');
if ($linenos.length > 0) {
var txt = $linenos.last().text();
var m = txt.match(/(\d+)/);
if (m) rightLineNum = parseInt(m[1]);
return;
}
if ($tr.find('.diff-addedline').length > 0 || $tr.find('.diff-context').length > 0) {
$tr.attr('data-line', rightLineNum);
$tr.css('cursor', 'pointer').attr('title', 'Jump to line ' + rightLineNum);
rightLineNum++;
}
});
// Attach a single delegated click listener to the table instead of every row
$visualOut.find('table.diff').on('click', 'tr[data-line]', function() {
Editor.scrollToLine(parseInt($(this).attr('data-line')));
});
}
function renderPreview() {
$visualOut.html('<div style="color:#888; text-align:center;">Generating Preview...</div>');
new mw.Api().post({
action: 'parse',
title: currentTitle,
text: Editor.getValue(),
prop: 'text|categorieshtml|modules|jsconfigvars',
useskin: mw.config.get('skin'),
disablelimitreport: true,
pst: true,
contentmodel: 'wikitext'
}).then(function(data) {
if (data.parse && data.parse.text) {
var $prev = $('<div>').html(data.parse.text['*']);
if (data.parse.categorieshtml) $prev.append(data.parse.categorieshtml['*']);
$prev.find('a').attr('target', '_blank');
$visualOut.empty().append($prev);
mw.loader.using(data.parse.modules.concat(data.parse.modulestyles, data.parse.modulescripts), function() {
mw.hook('wikipage.content').fire($('.wa-visual-output .mw-parser-output'));
});
}
}).catch(function(err) {
$visualOut.html('Error generating preview.');
alert("Preview failed: " + err);
});
}
async function transformPageText(rawText, title, config) {
var filters = config.filters;
if (filters) {
var check = function(text, rule) {
if (!rule || !rule.val) return false;
if (rule.regex) {
try {
return new RegExp(rule.val, 'mu').test(text);
} catch (e) {
return false;
}
}
return text.indexOf(rule.val) !== -1;
};
if (filters.skipContains && filters.skipContains.val && check(rawText, filters.skipContains)) {
return {
skipped: true,
reason: 'Contains: ' + filters.skipContains.val
};
}
if (filters.skipNotContains && filters.skipNotContains.val && !check(rawText, filters.skipNotContains)) {
return {
skipped: true,
reason: 'Missing: ' + filters.skipNotContains.val
};
}
}
var mode = config.mode;
var inputs = [];
var compiledSpecies = null;
if (config.templateFilter) {
var tFilter = config.templateFilter;
if (tFilter[0] === "^") tFilter = "^\\{\\{\\s*" + tFilter.slice(1);
else tFilter = "\\{\\{\\s*" + tFilter;
compiledSpecies = tFilter + "(?=\\s*[|}\\n])";
}
var skeleton = PageProtector.protect(rawText, mode, config.excludes, compiledSpecies);
if (mode === 'target') inputs = PageProtector.store;
else inputs = [skeleton];
var combinedRules = rulesRegistry.filter(r => r.isActive()).map(r => ({
find: r.find.getValue(),
replace: r.rep.getValue(),
regex: r.regex.getValue(),
flags: r.flags.getValue(),
enabled: r.isActive(),
isFunc: r.isFunc()
}));
if (togWikiTypos.getValue()) combinedRules = combinedRules.concat(wikiTypos);
if (localTypos.length > 0) combinedRules = combinedRules.concat(localTypos);
var payload = {
texts: inputs,
vars: config.vars,
preCode: getUserCode(txtPreScript, 'wAwB_Pre'),
libraryCode: currentLibrary.code,
rules: combinedRules,
postCode: getUserCode(txtPostScript, 'wAwB_Post')
};
var result = await WorkerEngine.run(payload);
if (result.skipped) return {
skipped: true,
reason: result.reason
};
var finalText = "";
if (mode === 'target') {
PageProtector.store = result.texts;
finalText = PageProtector.restore(skeleton);
} else {
finalText = PageProtector.restore(result.texts[0]);
}
return {
skipped: false,
text: finalText,
summaryAppend: result.summaryAppend,
summaryOverride: result.summaryOverride
};
}
async function processPageContent() {
try {
setStatus('Processing...', 'working');
var mode = dropProtMode.getValue();
var activeConfig = {
mode: mode,
excludes: {},
templateFilter: inpTemplateFilter.getValue().trim(),
vars: currentVars,
filters: {
skipContains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
skipNotContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
}
}
};
if (mode === 'protect') {
for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected();
} else {
var sel = radTargetSet.findSelectedItem();
activeConfig.excludes = sel ? sel.getData() : null;
}
var res = await transformPageText(originalWikitext, currentTitle, activeConfig);
if (res.skipped) {
removeTopLine();
loadNextPage();
return;
}
currentPageSummaryAppend = res.summaryAppend || "";
currentPageSummaryOverride = res.summaryOverride || null;
updateSummaryPreview(inputSummary.getValue());
if (chkSkipNoChange.isSelected() && res.text === originalWikitext) {
removeTopLine();
loadNextPage();
return;
}
setStatus('Ready');
Editor.setValue(res.text);
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
else {
Editor.setDisabled(false);
btnSave.setDisabled(!PERMS.canSave);
btnSkip.setDisabled(false);
btnPreview.setDisabled(false);
btnDiff.setDisabled(false);
}
updateDirtyState();
renderCurrentView();
if (PERMS.allowBot && togAutoSave.getValue()) {
var delay = Math.max(0, parseInt(txtAutoDelay.getValue(), 10) || 0) * 1000;
setStatus('Auto-save in ' + (delay / 1000) + 's...', 'working');
if (autoSaveTimer) clearTimeout(autoSaveTimer);
autoSaveTimer = setTimeout(function() {
if (isRunning && PERMS.canSave) {
btnSave.emit('click');
}
}, delay);
}
} catch (e) {
setStatus('Error', 'error');
alert(e);
btnPower.emit('click');
}
}
async function runPreParseBatch() {
// 1. Toggle / Stop Logic
if (isRunning) {
isRunning = false;
setStatus('Stopping...', 'working');
btnPreParse.setLabel('Pre-parse');
return;
}
// 2. Start & Deduplicate
var currentVal = listTextarea.getValue();
var cleanVal = getDeduplicatedList(currentVal).join('\n');
listTextarea.setValue(cleanVal);
updateListCount();
isRunning = true;
toggleUI(true);
// 3. Lock UI
toggleUI(true);
btnSkip.setDisabled(true);
btnDiff.setDisabled(true);
btnPreview.setDisabled(true);
btnSave.setDisabled(true);
Editor.setDisabled(true);
btnPreParse.setLabel('Stop pre-parse');
// Inject STOP marker if not present
var currentList = listTextarea.getValue().split('\n');
if (!currentList.includes('####STOP')) {
currentList.push('####STOP');
listTextarea.setValue(currentList.join('\n'));
}
// Gather Config
var activeConfig = {
mode: dropProtMode.getValue(),
excludes: {},
templateFilter: inpTemplateFilter.getValue().trim(),
vars: {},
filters: {
skipContains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
skipNotContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
}
}
};
if (activeConfig.mode === 'protect') {
for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected();
} else {
var sel = radTargetSet.findSelectedItem();
activeConfig.excludes = sel ? sel.getData() : null;
}
setStatus('Pre-parsing...', 'working');
while (isRunning) {
var lines = listTextarea.getValue().split('\n');
var batchTitles = [];
var stopFound = false;
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (line === '####STOP') {
stopFound = true;
break;
}
if (line && !line.startsWith('####')) {
var parts = line.split('|');
batchTitles.push({
fullLine: line,
title: parts[0],
vars: parts.slice(1)
});
}
if (batchTitles.length >= 50) break;
}
if (batchTitles.length === 0) {
if (stopFound) setStatus('Pre-parse complete');
else setStatus('List empty');
break;
}
$listCounter.text('Fetching ' + batchTitles.length + '...');
var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var api = new mw.Api();
try {
var data = await api.get({
action: 'query',
prop: 'revisions' + (badCats.length + reqCats.length > 0 ? '|categories' : ''),
titles: batchTitles.map(t => t.title).join('|'),
rvprop: 'content',
rvslots: 'main',
redirects: 1,
cllimit: 'max'
});
var pageMap = {};
if (data.query && data.query.pages) Object.values(data.query.pages).forEach(p => pageMap[p.title] = p);
var redirMap = {};
if (data.query && data.query.redirects) data.query.redirects.forEach(r => redirMap[r.from] = r.to);
var keptLines = [];
for (var k = 0; k < batchTitles.length; k++) {
var item = batchTitles[k];
var lookupTitle = redirMap[item.title] || item.title;
var page = pageMap[lookupTitle];
if (!page || page.missing || page.invalid || !page.revisions || !page.revisions[0]) {
console.warn("Skipping invalid/missing page:", item.title);
continue;
}
var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim()));
if (badCats.some(c => pageCats.has(c))) continue; // Skip
if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) continue; // Skip
var rawText = page.revisions[0].slots.main['*'];
activeConfig.vars = {
'$xx': item.title
};
item.vars.forEach((v, idx) => activeConfig.vars['$x' + String.fromCharCode(65 + idx)] = v);
var res = await transformPageText(rawText, item.title, activeConfig);
// UPDATED LOGIC: Respect "Skip if no change" checkbox
if (!res.skipped && (!chkSkipNoChange.isSelected() || res.text !== rawText)) {
keptLines.push(item.fullLine);
}
}
var freshLines = listTextarea.getValue().split('\n');
var stopIndex = -1;
for (var x = 0; x < freshLines.length; x++) {
if (freshLines[x] === '####STOP') {
stopIndex = x;
break;
}
}
if (stopIndex > -1) {
var topChunk = freshLines.slice(0, stopIndex);
var botChunk = freshLines.slice(stopIndex + 1);
var processedSet = new Set(batchTitles.map(t => t.fullLine));
var newTop = topChunk.filter(l => !processedSet.has(l));
var newList = newTop.concat(['####STOP']).concat(botChunk).concat(keptLines);
listTextarea.setValue(newList.join('\n'));
updateListCount();
}
} catch (e) {
console.error(e);
setStatus('Batch error: ' + e, 'error');
break;
}
}
isRunning = false;
toggleUI(false);
WorkerEngine.destroy();
btnPreParse.setLabel('Pre-parse');
if (listTextarea.getValue().startsWith('####STOP')) setStatus('Pre-parse done!');
else setStatus('Stopped');
}
btnPreParse.on('click', runPreParseBatch);
function loadNextPage() {
if (!isRunning) return;
var allLines = listTextarea.getValue().split('\n');
var listChanged = false;
var stopCommand = false;
while (allLines.length > 0) {
var line = allLines[0];
if (line === '####STOP') {
stopCommand = true;
break;
}
if (line.startsWith('####') || line === "") {
allLines.shift();
listChanged = true;
} else {
break;
}
}
if (listChanged) {
listTextarea.setValue(allLines.join('\n'));
updateListCount();
}
if (stopCommand) {
btnPower.emit('click');
setStatus("Stopped by ####STOP");
return;
}
if (allLines.length === 0) {
btnPower.emit('click');
setStatus("Done!");
return;
}
var raw = allLines[0];
var parts = raw.split('|');
currentTitle = parts[0].trim();
baseRevId = 0;
originalWikitext = "";
if (!currentTitle) {
removeTopLine();
loadNextPage();
return;
}
currentVars = {};
currentVars['$xx'] = currentTitle;
for (var i = 1; i < parts.length; i++) currentVars['$x' + String.fromCharCode(64 + i)] = parts[i];
currentPageSummaryAppend = "";
currentPageSummaryOverride = null;
updateSummaryPreview(inputSummary.getValue());
setStatus('Loading...', 'working');
btnSave.setDisabled(true);
btnPreview.setDisabled(true);
btnDiff.setDisabled(true);
btnSkip.setDisabled(true);
Editor.setDisabled(true);
$titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle);
$editorHeader.removeClass('wa-dirty');
$visualOut.empty();
Editor.setValue('Loading...');
$infoContainer.empty();
currentPageExists = false;
btnWatch.setDisabled(true);
btnManualEdit.setDisabled(true);
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s);
var api = new mw.Api();
var params = {
action: 'query',
prop: 'revisions|info' + (badCats.length + reqCats.length > 0 ? '|categories' : ''),
titles: currentTitle,
rvprop: 'content|timestamp|ids',
rvslots: 'main',
inprop: 'watched',
cllimit: 'max'
};
var rMode = redirMode.findSelectedItem().getData();
if (rMode === 'follow') params.redirects = 1;
return api.get(params).then(async function(data) {
var pid = Object.keys(data.query.pages)[0];
var page = data.query.pages[pid];
currentPageExists = !page.missing && !page.invalid;
var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim()));
if (badCats.some(c => pageCats.has(c))) {
setStatus('Skip: cat blacklist');
removeTopLine();
loadNextPage();
return;
}
if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) {
setStatus('Skip: cat whitelist');
removeTopLine();
loadNextPage();
return;
}
if (rMode === 'follow' && data.query.redirects) {
currentTitle = page.title;
$titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle);
mw.notify('Redirect followed to: ' + currentTitle);
}
if (rMode === 'skip' && page.redirect !== undefined) {
removeTopLine();
loadNextPage();
return;
}
var skipMode = radSkipExist.findSelectedItem().getData();
if (pid === "-1") {
if (skipMode === 'missing') {
removeTopLine();
loadNextPage();
return;
}
originalWikitext = "";
baseRevId = 0;
} else {
if (skipMode === 'exists') {
removeTopLine();
loadNextPage();
return;
}
originalWikitext = page.revisions[0].slots.main['*'];
baseRevId = page.revisions[0].revid;
}
if (page.revisions && page.revisions.length > 0) {
var rev = page.revisions[0];
var ts = new Date(rev.timestamp).toISOString().replace('T', ' ').substring(0, 16);
$infoContainer.empty().append('Last edit: ' + ts + ' | ', $('<a>').attr('href', mw.util.getUrl(currentTitle, {
action: 'history'
})).attr('target', '_blank').text('history'));
}
btnWatch.setDisabled(!currentPageExists);
btnManualEdit.setDisabled(!currentPageExists);
if (page.watched !== undefined) btnWatch.setIcon('unStar');
else btnWatch.setIcon('star');
if (CAN_MOVE || IS_ADMIN) {
updateInterfaceMode();
if (togAdminEnable.getValue()) {
Editor.setValue(originalWikitext);
renderCurrentView();
setStatus('Ready (Page actions)');
return;
}
}
processPageContent();
}).catch(function(e) {
setStatus('API error', 'error');
alert('Load error: ' + e);
btnPower.emit('click');
});
}
async function fetchWithContinue(api, params) {
var allTitles = new Set();
var continueToken = {};
var safetyLimit = FETCH_SAFETY_LIMIT;
var count = 0;
isFetching = true;
btnAdd.setLabel('Cancel fetch');
$fetchStatus.text('Fetching...').show();
try {
while (isFetching && count < safetyLimit) {
var merged = Object.assign({}, params, continueToken);
var data = await api.get(merged);
var batch = [];
if (data.watchlistraw) batch = data.watchlistraw;
else if (data.query) {
if (data.query.pages) batch = Object.values(data.query.pages);
else if (data.query.categorymembers) batch = data.query.categorymembers;
else if (data.query.backlinks) batch = data.query.backlinks;
else if (data.query.embeddedin) batch = data.query.embeddedin;
else if (data.query.imageusage) batch = data.query.imageusage;
else if (data.query.search) batch = data.query.search;
else if (data.query.allpages) batch = data.query.allpages;
else if (data.query.usercontribs) batch = data.query.usercontribs;
else if (data.query.pageswithprop) batch = data.query.pageswithprop;
}
if (batch.length > 0) {
batch.forEach(item => {
if (item.title) allTitles.add(item.title);
});
count = allTitles.size;
$fetchStatus.text('Fetched ' + count + '...');
}
if (data.continue) continueToken = data.continue;
else break;
}
} catch (e) {
alert("Fetch interrupted: " + e);
}
isFetching = false;
btnAdd.setLabel('Add to list').setDisabled(false);
$fetchStatus.text('Added ' + allTitles.size + ' pages').delay(3000).fadeOut();
if (allTitles.size > 0) {
hasNewSources = true;
checkSummaryWarning();
}
return Array.from(allTitles);
}
function toggleUI(d) {
if (d) {
btnPower.setLabel('Stop').setIcon('power').setFlags(['destructive']);
} else {
btnPower.setLabel('Start').setIcon('power').clearFlags().setFlags(['primary', 'progressive']);
if (PERMS.allowBot) togAutoSave.setValue(false);
}
toggleConfig(d);
btnSort.setDisabled(d);
btnDedup.setDisabled(d);
btnClear.setDisabled(d);
btnSaveProj.setDisabled(d);
btnLoadProj.setDisabled(d);
btnSkip.setDisabled(!d);
btnSave.setDisabled(true);
listTextarea.setReadOnly(d);
if (d) listTextarea.$element.addClass('wa-list-running');
else listTextarea.$element.removeClass('wa-list-running');
}
function resetPanels() {
Editor.setValue('');
$titleLink.text('Page content').removeAttr('href');
$editorHeader.removeClass('wa-dirty');
setStatus('Ready');
$('#wa-summary-preview').val('');
currentTitle = null;
$visualOut.html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready...</div>');
$infoContainer.empty();
btnWatch.setDisabled(true);
btnManualEdit.setDisabled(true);
Editor.setDisabled(true);
currentPageExists = false;
if (CAN_MOVE || IS_ADMIN) updateInterfaceMode();
toggleUI(false);
updateListCount();
if (autoSaveTimer) clearTimeout(autoSaveTimer);
}
function arrayMove(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) arr.push(undefined);
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
}
function updateRuleButtons() {
rulesRegistry.forEach(function(item, idx) {
item.btnUp.setDisabled(idx === 0);
item.btnDown.setDisabled(idx === rulesRegistry.length - 1);
});
}
function addRule() {
var row = $('<div>').addClass('wa-rule-row');
var controls = $('<div>').addClass('wa-rule-controls');
var btnUp = new OO.ui.ButtonWidget({
icon: 'collapse',
framed: false,
title: 'Move up',
classes: ['wa-rule-btn']
});
var btnDown = new OO.ui.ButtonWidget({
icon: 'expand',
framed: false,
title: 'Move down',
classes: ['wa-rule-btn']
});
controls.append(btnUp.$element, btnDown.$element);
var contentDiv = $('<div>').addClass('wa-rule-content');
var f = new OO.ui.TextInputWidget({
placeholder: 'Find'
});
var r = new OO.ui.TextInputWidget({
placeholder: 'Replace'
});
var reg = new OO.ui.ToggleSwitchWidget();
var fl = new OO.ui.TextInputWidget({
value: 'gmu',
disabled: true
}).toggle(false);
var btnEnable = new OO.ui.ButtonWidget({
icon: 'power',
framed: false,
title: 'Toggle rule',
flags: ['progressive']
});
var isRuleActive = true;
var btnFunc = new OO.ui.ButtonWidget({
icon: 'code',
framed: false,
title: 'Toggle JS mode',
disabled: true
});
var isRuleFunc = false;
var toggleRule = function(forceVal) {
var val = (forceVal !== undefined) ? forceVal : !isRuleActive;
isRuleActive = val;
row.css('opacity', isRuleActive ? 1 : 0.5);
if (isRuleActive) btnEnable.setFlags(['progressive']);
else btnEnable.clearFlags();
};
btnEnable.on('click', function() {
toggleRule();
});
var toggleFunc = function(forceVal) {
var val = (forceVal !== undefined) ? forceVal : !isRuleFunc;
isRuleFunc = val;
if (isRuleFunc) {
btnFunc.setFlags(['progressive']);
r.$input.attr('placeholder', 'return match.toUpperCase();');
} else {
btnFunc.clearFlags();
r.$input.attr('placeholder', 'Replace');
}
};
btnFunc.on('click', function() {
toggleFunc();
});
btnFunc.toggle(false);
reg.on('change', function(v) {
fl.setDisabled(!v);
fl.toggle(v);
btnFunc.setDisabled(!v);
if (!v) {
btnFunc.toggle(false);
if (isRuleFunc) toggleFunc(false);
} else btnFunc.toggle(true);
});
var del = new OO.ui.ButtonWidget({
icon: 'trash',
flags: 'destructive',
framed: false,
title: 'Delete rule',
});
del.on('click', function() {
row.fadeOut(200, function() {
row.remove();
rulesRegistry = rulesRegistry.filter(x => x.row !== row);
updateRuleButtons();
});
});
contentDiv.append(f.$element, $('<div>').css('margin-top', '3px').append(r.$element), $('<div>').addClass('wa-rule-opt-row').append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<div>').css({
'display': 'flex',
'align-items': 'center'
}).append($('<span>').text('Regex: ').css({
'font-size': '0.8em',
'margin-right': '4px'
}), reg.$element, fl.$element.css({
'width': '50px',
'margin-left': '5px'
})), btnFunc.$element.css('margin-left', '10px')), $('<div>').css('display', 'flex').append(btnEnable.$element, del.$element)));
row.append(controls, contentDiv);
$rulesList.append(row);
var ruleItem = {
row: row,
find: f,
rep: r,
regex: reg,
flags: fl,
btnUp: btnUp,
btnDown: btnDown,
enable: btnEnable,
del: del,
btnFunc: btnFunc,
isActive: function() {
return isRuleActive;
},
setActive: toggleRule,
isFunc: function() {
return isRuleFunc;
},
setFunc: toggleFunc
};
rulesRegistry.push(ruleItem);
btnUp.on('click', function() {
var idx = rulesRegistry.indexOf(ruleItem);
if (idx > 0) {
var prevRow = rulesRegistry[idx - 1].row;
row.fadeOut(150, function() {
row.insertBefore(prevRow).fadeIn(150).addClass('wa-highlight');
setTimeout(function() {
row.removeClass('wa-highlight');
}, 500);
});
arrayMove(rulesRegistry, idx, idx - 1);
updateRuleButtons();
}
});
btnDown.on('click', function() {
var idx = rulesRegistry.indexOf(ruleItem);
if (idx < rulesRegistry.length - 1) {
var nextRow = rulesRegistry[idx + 1].row;
row.fadeOut(150, function() {
row.insertAfter(nextRow).fadeIn(150).addClass('wa-highlight');
setTimeout(function() {
row.removeClass('wa-highlight');
}, 500);
});
arrayMove(rulesRegistry, idx, idx + 1);
updateRuleButtons();
}
});
updateRuleButtons();
}
btnAddRule.on('click', addRule);
addRule();
togWikiTypos.on('change', function(v) {
if (v) {
if (wikiTypos.length > 0) lblWikiStatus.text(wikiTypos.length + ' rules loaded (Cached)');
else {
lblWikiStatus.text('Fetching...');
togWikiTypos.setDisabled(true);
new mw.Api().get({
action: 'query',
prop: 'revisions',
titles: mw.config.get('wgFormattedNamespaces')[4] + ':AutoWikiBrowser/Typos',
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(d) {
var page = d.query.pages[0];
if (!page.missing) {
wikiTypos = parseTypoContent(page.revisions[0].slots.main.content);
lblWikiStatus.text(wikiTypos.length + ' rules loaded');
} else {
lblWikiStatus.text('Page not found');
togWikiTypos.setValue(false);
}
}).catch(function() {
lblWikiStatus.text('Error');
togWikiTypos.setValue(false);
}).always(function() {
togWikiTypos.setDisabled(false);
});
}
} else lblWikiStatus.text('Rules inactive');
});
btnLoadLocal.on('click', function() {
$typoInput.click();
});
$typoInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
localTypos = parseTypoContent(evt.target.result);
lblLocalStatus.text(localTypos.length + ' local rules loaded');
btnClearLocal.setDisabled(false);
};
reader.readAsText(file);
$typoInput.val('');
});
btnClearLocal.on('click', function() {
localTypos = [];
lblLocalStatus.text('No local rules');
btnClearLocal.setDisabled(true);
});
btnLoadLib.on('click', function() {
$libInput.click();
});
btnRemoveLib.on('click', function() {
currentLibrary = {
name: null,
code: null
};
updateLibUI();
});
$libInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
currentLibrary = {
name: file.name,
code: evt.target.result
};
updateLibUI();
};
reader.readAsText(file);
$libInput.val('');
});
btnPower.on('click', function() {
hasNewSources = false;
checkSummaryWarning();
if (!isRunning) {
if (SAVED_SESSION === 0) mw.track('stats.mediawiki_gadget_wAwB_total');
isRunning = true;
toggleUI(true);
loadNextPage();
} else {
if (SAVED_RUN > 0) {
mw.track('stats.mediawiki_gadget_wAwB_saved_total', SAVED_RUN, {
wiki: WIKI
});
SAVED_SESSION += SAVED_RUN;
SAVED_RUN = 0;
}
isRunning = false;
toggleUI(false);
WorkerEngine.destroy();
resetPanels();
}
});
inputSummary.on('change', function() {
checkSummaryWarning();
if (currentTitle) {
updateSummaryPreview(inputSummary.getValue());
}
});
btnSkip.on('click', function() {
if (Editor.getValue() === 'Loading...') return;
removeTopLine();
loadNextPage();
});
btnDiff.on('click', function() {
currentViewMode = 'diff';
updateDirtyState();
if (currentTitle) renderDiff();
});
btnPreview.on('click', function() {
currentViewMode = 'preview';
updateDirtyState();
if (currentTitle) renderPreview();
});
btnSave.on('click', function() {
if (Editor.getValue() === 'Loading...' || !currentTitle) return;
if (autoSaveTimer) clearTimeout(autoSaveTimer);
btnSave.setDisabled(true);
setStatus('Saving...', 'working');
var effectiveDelay = PERMS.saveDelay || 0;
if (effectiveDelay > 0) setStatus('Throttling (' + (effectiveDelay / 1000) + 's)...', 'working');
setTimeout(function() {
if (effectiveDelay > 0) setStatus('Saving...', 'working');
var finalSum = $('#wa-summary-preview').val().trim();
var summary = finalSum + SUMMARY_SUFFIX;
new mw.Api().postWithToken('csrf', {
action: 'edit',
assert: 'user', //throw 'assertuserfailed' when logged-out
title: currentTitle,
text: Editor.getValue(),
summary: summary,
minor: chkMinor.isSelected(),
baserevid: baseRevId,
bot: PERMS.allowBot,
watchlist: 'nochange',
tags: DO_TAG ? APP_NAME : undefined
}).then(function() {
SAVED_RUN += 1;
removeTopLine();
loadNextPage();
}).catch(function(c) {
btnSave.setDisabled(false);
setStatus('Save error', 'error');
alert('Save failed: ' + c);
});
}, effectiveDelay);
});
btnManualEdit.on('click', function() {
if (Editor.getValue() === 'Loading...' || !currentTitle) return;
// Calculate the final injected summary
var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : inputSummary.getValue();
var finalSum = base + (currentPageSummaryAppend || "");
var translatedSummary = injectVars(finalSum);
var summary = translatedSummary; // no SUMMARY_SUFFIX
// Create an invisible form targeting a new tab
var $form = $('<form>').attr({
method: 'POST',
action: mw.util.getUrl(currentTitle, { action: 'edit' }),
target: '_blank'
}).hide();
// Populate it with MediaWiki's native input names
$('<textarea>').attr('name', 'wpTextbox1').val(Editor.getValue()).appendTo($form);
$('<input>').attr('name', 'wpSummary').val(summary).appendTo($form);
if (chkMinor.isSelected()) {
$('<input>').attr('name', 'wpMinoredit').val('1').appendTo($form);
}
// Append, fire, and destroy
$form.appendTo('body').submit().remove();
});
btnWatch.on('click', function() {
var isWatched = btnWatch.getIcon() === 'unStar';
new mw.Api()[isWatched ? 'unwatch' : 'watch'](currentTitle).then(function() {
btnWatch.setIcon(isWatched ? 'star' : 'unStar');
mw.notify(isWatched ? 'Unwatched' : 'Watched');
});
});
btnAdd.on('click', function() {
if (isFetching) {
isFetching = false;
btnAdd.setDisabled(true).setLabel('Cancelling...');
return;
}
try {
var mode = srcSelect.getValue(),
q = srcInput.getValue().trim();
if (mode !== 'watchlist' && mode !== 'usercontribs' && mode !== 'pageswithprop' && !q) {
alert('Query empty');
return;
}
var nsIds = ($nsSelect.val() || []).map(v => parseInt(v));
var nsStr = nsIds.join('|');
var api = new mw.Api(),
promises = [];
if (mode === 'cat') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'categorymembers',
cmtitle: mw.Title.newFromText(q, 14) ? mw.Title.newFromText(q, 14).getPrefixedText() : 'Category:' + q,
cmnamespace: nsStr,
cmtype: (chkCatPages.isSelected() ? 'page|' : '') + (chkCatSub.isSelected() ? 'subcat|' : '') + (chkCatFile.isSelected() ? 'file' : ''),
cmlimit: 'max'
}));
else if (mode === 'linksto') {
if (chkLinkWiki.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'backlinks',
bltitle: q,
blnamespace: nsStr,
bllimit: 'max',
blfilterredir: dropLinkRedir.getValue(),
blredirect: chkLinkToRedir.isSelected()
}));
if (chkLinkTrans.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'embeddedin',
eititle: q,
einamespace: nsStr,
eilimit: 'max',
eifilterredir: dropLinkRedir.getValue()
}));
if (chkLinkImg.isSelected()) promises.push(fetchWithContinue(api, {
action: 'query',
list: 'imageusage',
iutitle: q,
iunamespace: nsStr,
iulimit: 'max',
iufilterredir: dropLinkRedir.getValue()
}));
} else if (mode === 'linkson') promises.push(fetchWithContinue(api, {
action: 'query',
generator: 'links',
titles: q,
gplnamespace: nsStr,
gpllimit: 'max',
prop: 'info'
}));
else if (mode === 'prefix') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'allpages',
apprefix: q,
apnamespace: nsIds[0] || 0,
aplimit: 'max'
}));
else if (mode === 'watchlist') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'watchlistraw',
wrnamespace: nsStr,
wrlimit: 'max'
}));
else if (mode === 'search') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'search',
srsearch: q,
srnamespace: nsStr,
srlimit: 'max'
}));
else if (mode === 'usercontribs') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'usercontribs',
ucuser: srcInputUser.getValue(),
ucstart: srcInputStartDate.getValue(),
ucend: srcInputEndDate.getValue(),
ucdir: 'newer',
uclimit: 'max',
ucnamespace: nsStr,
ucprop: 'title'
}));
else if (mode === 'pageswithprop') promises.push(fetchWithContinue(api, {
action: 'query',
list: 'pageswithprop',
pwppropname: srcDropProp.getValue(),
pwplimit: 'max'
}));
Promise.all(promises).then(function(res) {
var list = new Set();
res.forEach(titles => titles.forEach(t => list.add(t)));
var currentVal = listTextarea.getValue();
var newVal = Array.from(list).join('\n');
listTextarea.setValue(currentVal ? currentVal + '\n' + newVal : newVal);
mw.notify('Added ' + list.size + ' pages');
}).catch(e => alert('Error: ' + e));
} catch (e) {
alert("Fetch error: " + e);
}
});
btnSort.on('click', function() {
var v = listTextarea.getValue();
if (v) {
var lines = getNormalizedList(v);
lines.sort((a, b) => sortAsc ? a.localeCompare(b) : b.localeCompare(a));
listTextarea.setValue(lines.join('\n'));
sortAsc = !sortAsc;
}
});
btnDedup.on('click', function() {
var v = listTextarea.getValue();
if (v) listTextarea.setValue(getDeduplicatedList(v).join('\n'));
});
btnClear.on('click', function() {
listTextarea.setValue('');
});
btnSaveProj.on('click', function() {
try {
var currentMode = srcSelect.getValue();
if (['watchlist', 'usercontribs', 'pageswithprop'].indexOf(currentMode) === -1) queryCache[currentMode] = srcInput.getValue();
var saveExcludes = {};
for (var k in protCheckboxes) saveExcludes[k] = protCheckboxes[k].isSelected();
var data = {
version: APP_VERSION,
library: currentLibrary,
source: {
activeMode: currentMode,
namespaces: ($nsSelect.val() || []).map(v => parseInt(v)),
modes: {
cat: {
query: queryCache['cat'] || '',
options: {
pages: chkCatPages.isSelected(),
sub: chkCatSub.isSelected(),
file: chkCatFile.isSelected()
}
},
linksto: {
query: queryCache['linksto'] || '',
options: {
wiki: chkLinkWiki.isSelected(),
trans: chkLinkTrans.isSelected(),
img: chkLinkImg.isSelected(),
redir: dropLinkRedir.getValue(),
toRedir: chkLinkToRedir.isSelected()
}
},
linkson: {
query: queryCache['linkson'] || ''
},
prefix: {
query: queryCache['prefix'] || ''
},
watchlist: {
query: ''
},
search: {
query: queryCache['search'] || ''
},
usercontribs: {
options: {
user: srcInputUser.getValue(),
start: srcInputStartDate.getValue(),
end: srcInputEndDate.getValue()
}
},
pageswithprop: {
options: {
prop: srcDropProp.getValue()
}
}
}
},
settings: {
redir: redirMode.findSelectedItem().getData(),
skipLogic: radSkipExist.findSelectedItem().getData(),
skipNoChange: chkSkipNoChange.isSelected(),
minor: chkMinor.isSelected()
},
filters: {
contains: {
val: inpSkipContains.getValue(),
regex: togSkipContainsRegex.getValue()
},
notContains: {
val: inpSkipNotContains.getValue(),
regex: togSkipNotContainsRegex.getValue()
},
categories: {
skip: inpSkipCategories.getValue(),
require: inpSkipNotCategories.getValue()
}
},
rules: rulesRegistry.map(r => ({
find: r.find.getValue(),
replace: r.rep.getValue(),
regex: r.regex.getValue(),
flags: r.flags.getValue(),
enabled: r.isActive(),
isFunc: r.isFunc()
})),
scripts: {
pre: txtPreScript.getValue(),
post: txtPostScript.getValue()
},
processing: {
summary: inputSummary.getValue(),
list: listTextarea.getValue()
},
protection: {
mode: dropProtMode.getValue(),
excludes: saveExcludes,
target: (radTargetSet.findSelectedItem() || {
getData: () => null
}).getData(),
templateFilter: inpTemplateFilter.getValue()
}
};
var a = document.createElement('a');
a.href = URL.createObjectURL(new Blob([JSON.stringify(data, null, 1)], {
type: "application/json"
}));
a.download = "wawb_project.json";
a.click();
} catch (e) {
alert("Save error: " + e);
}
});
btnLoadProj.on('click', function() {
$fileInput.click();
});
$fileInput.on('change', function(e) {
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(evt) {
try {
var data = JSON.parse(evt.target.result);
isLoadingProject = true;
if (data.source) {
if (data.source.namespaces) $nsSelect.val(data.source.namespaces.map(String));
if (data.source.modes) {
var m = data.source.modes;
queryCache = {};
for (var key in m)
if (m[key].query !== undefined) queryCache[key] = m[key].query;
if (m.cat && m.cat.options) {
chkCatPages.setSelected(m.cat.options.pages);
chkCatSub.setSelected(m.cat.options.sub);
chkCatFile.setSelected(m.cat.options.file);
}
if (m.linksto && m.linksto.options) {
chkLinkWiki.setSelected(m.linksto.options.wiki);
chkLinkTrans.setSelected(m.linksto.options.trans);
chkLinkImg.setSelected(m.linksto.options.img);
dropLinkRedir.setValue(m.linksto.options.redir);
chkLinkToRedir.setSelected(m.linksto.options.toRedir);
}
if (m.usercontribs && m.usercontribs.options) {
srcInputUser.setValue(m.usercontribs.options.user);
srcInputStartDate.setValue(m.usercontribs.options.start);
srcInputEndDate.setValue(m.usercontribs.options.end);
}
if (m.pageswithprop && m.pageswithprop.options) srcDropProp.setValue(m.pageswithprop.options.prop);
}
if (data.source.activeMode) {
srcSelect.setValue(data.source.activeMode);
isLoadingProject = false;
srcSelect.emit('change', data.source.activeMode);
isLoadingProject = true;
}
}
if (data.settings) {
redirMode.selectItemByData(data.settings.redir);
chkSkipNoChange.setSelected(data.settings.skipNoChange);
radSkipExist.selectItemByData(data.settings.skipLogic);
if (data.settings.minor !== undefined) chkMinor.setSelected(data.settings.minor);
}
if (data.protection) {
dropProtMode.setValue(data.protection.mode);
for (var k in data.protection.excludes)
if (protCheckboxes[k]) protCheckboxes[k].setSelected(data.protection.excludes[k]);
if (data.protection.target) radTargetSet.selectItemByData(data.protection.target);
if (data.protection.templateFilter) inpTemplateFilter.setValue(data.protection.templateFilter);
}
if (data.library) {
currentLibrary = data.library;
updateLibUI();
}
if (data.filters) {
inpSkipContains.setValue(data.filters.contains.val);
togSkipContainsRegex.setValue(data.filters.contains.regex);
inpSkipNotContains.setValue(data.filters.notContains.val);
togSkipNotContainsRegex.setValue(data.filters.notContains.regex);
}
if (data.filters.categories) {
inpSkipCategories.setValue(data.filters.categories.skip);
inpSkipNotCategories.setValue(data.filters.categories.require);
}
rulesRegistry.forEach(r => r.row.remove());
rulesRegistry = [];
$rulesList.empty();
if (data.rules) data.rules.forEach(r => {
addRule();
var last = rulesRegistry[rulesRegistry.length - 1];
last.find.setValue(r.find);
last.rep.setValue(r.replace);
last.regex.setValue(r.regex);
last.flags.setValue(r.flags);
last.flags.setDisabled(!r.regex);
last.setActive(r.enabled);
if (r.isFunc) last.setFunc(true);
});
if (rulesRegistry.length === 0) addRule();
if (data.scripts) {
txtPreScript.setValue(data.scripts.pre);
txtPostScript.setValue(data.scripts.post);
}
if (data.processing) {
inputSummary.setValue(data.processing.summary);
listTextarea.setValue(data.processing.list);
}
isLoadingProject = false;
setStatus('Project loaded');
} catch (err) {
alert("Error: " + err);
}
$fileInput.val('');
};
reader.readAsText(file);
});
if (CAN_MOVE || IS_ADMIN) {
togAdminEnable.on('change', function(val) {
if (!currentTitle) {
updateInterfaceMode();
return;
}
if (val) {
Editor.setValue(originalWikitext);
updateInterfaceMode();
renderDiff();
setStatus('Ready (Page actions)');
} else processPageContent();
});
}
if (CAN_MOVE) {
btnAdminMove.on('click', function() {
if (!currentVars['$xA']) {
mw.notify('Variable $xA not set', {
type: 'error'
});
return;
}
new mw.Api().postWithToken('csrf', {
action: 'move',
assert: 'user', //throw 'assertuserfailed' when logged-out
from: currentTitle,
to: currentVars['$xA'],
reason: inputSummary.getValue() + SUMMARY_SUFFIX,
movetalk: chkMovTalk.isSelected(),
movesubpages: chkMovSub.isSelected(),
noredirect: chkMovRedirect.isSelected()
}).then(function() {
removeTopLine();
loadNextPage();
}).catch(e => alert('Move failed: ' + e));
});
}
if (IS_ADMIN) {
btnAdminDel.on('click', function() {
new mw.Api().postWithToken('csrf', {
action: 'delete',
assert: 'user', //throw 'assertuserfailed' when logged-out
title: currentTitle,
reason: inputSummary.getValue() + SUMMARY_SUFFIX
}).then(function() {
if (chkDelTalk.isSelected()) new mw.Api().postWithToken('csrf', {
action: 'delete',
title: mw.Title.newFromText(currentTitle).getTalkPage().getPrefixedText(),
reason: 'Talk page of deleted page'
});
removeTopLine();
loadNextPage();
}).catch(e => alert('Delete failed: ' + e));
});
btnAdminProt.on('click', function() {
var protections = [];
if (dropProtEdit.getValue()) protections.push('edit=' + dropProtEdit.getValue());
if (dropProtMove.getValue()) protections.push('move=' + dropProtMove.getValue());
new mw.Api().postWithToken('csrf', {
action: 'protect',
assert: 'user', //throw 'assertuserfailed' when logged-out
title: currentTitle,
protections: protections.join('|'),
expiry: inpProtExpiry.getValue() || 'infinite',
reason: inputSummary.getValue() + SUMMARY_SUFFIX
}).then(function() {
removeTopLine();
loadNextPage();
}).catch(e => alert('Protect failed: ' + e));
});
}
Editor.init();
resetPanels();
});
$(window).on('beforeunload', function() {
return "You have unsaved work.";
});
}).catch(e => console.error("wAwB Loader Error:", e));
//</nowiki>
p4euplb3f9j6d84zkh8k8gb1fx9w62k
User:Whyiseverythingalreadyused/sandbox
2
172117
747799
735769
2026-06-21T00:05:11Z
Whyiseverythingalreadyused
70199
747799
wikitext
text/x-wiki
{{user sandbox}}
[[:Category:{{random|19{{random|8|9}}|20{{random|0|1}}}}0s cars]]
0y51u28hm7ul2s8wkufopamattga2ml
User:User97104
2
173974
747681
745416
2026-06-20T14:05:15Z
User97104
72884
747681
wikitext
text/x-wiki
User97104 will make an alternate account on Test Wikipedia for testing.
4767nsgonmijz08356c4tjhb0fvdzyq
747682
747681
2026-06-20T14:05:47Z
User97104
72884
747682
wikitext
text/x-wiki
User97104 has an alternate account on Test Wikipedia for testing. It is 97104-Test.
fki1ckra5gqa485ws0ssvf6lv951r2z
User:Ludo Games-T
2
175020
747753
739391
2026-06-20T17:30:05Z
Ludo Games-T
73707
747753
wikitext
text/x-wiki
Hello, '''Ludo Games-T''' here!
[[:commons:User:Ludo Games-T|Commons]] [[:en:User:Ludo Games-T|English Wikipedia]] [[:pt:Usuário:Ludo Games-T|Portuguese Wikipedia]] '''[[:simple:User:Ludo Games-T|Simple English Wikipedia]]''' [[:es:User:Ludo Games-T|Spanish Wikipedia]] '''Test Wikipedia''' [https://test2.wikipedia.org/wiki/User:Ludo_Games-T Test2 Wikipedia] [https://warper.wmflabs.org/users/8059 Wikimaps Warper]
mlg0kkzavpryjsxtol5ofyemacun3j1
Mergetest1
0
176325
747758
747647
2026-06-20T21:23:37Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]])
747758
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
9tvp52vom14uui3vh1k6tb37d11llpy
747762
747758
2026-06-20T21:25:09Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]])
747762
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
jpl9jtpkc1lov00249enke8qbm38sty
747765
747762
2026-06-20T21:25:52Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747765
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
dgd7fx5mkqvi9gl286aft1l5bbddz0y
747770
747765
2026-06-20T21:27:18Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747770
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
h2aya918pzy1albki795m3jrb9plgtu
747773
747770
2026-06-20T21:33:06Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747773
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
{{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}}
cpy7kaxu4sco64ezbwkgbuzfepfyiy4
747776
747773
2026-06-20T21:33:53Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747776
wikitext
text/x-wiki
#REDIRECT [[Mergetest2]]
mxo6a6oy1o9qh89g0hhb2972ehz8j1j
747780
747776
2026-06-20T21:45:36Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747780
wikitext
text/x-wiki
#REDIRECT [[Mergetest2]]
{{Rcat shell|
{{R to related topic}}
}}
ggd9waar9oa4kovuuv97lz2lwt1a7fz
747790
747780
2026-06-20T21:51:46Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747790
wikitext
text/x-wiki
{{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
#REDIRECT [[Mergetest2]]
{{Rcat shell|
{{R to related topic}}
}}
dycsw7fprakv6soxze7o6qz8cwn9ypf
Talk:Mergetest1
1
176335
747756
747644
2026-06-20T21:23:37Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]])
747756
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination)}}
ne8l9f0wcydofhb5nk9cysob25nk4b8
747760
747756
2026-06-20T21:25:09Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]])
747760
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination)}}
a2x1v7iaito9j3tqwzsaxkvgf8xh362
747764
747760
2026-06-20T21:25:52Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747764
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination)}}
olabp8nz7a8llhelwqmvdl1ehlnlpn0
747769
747764
2026-06-20T21:27:18Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747769
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination)}}
4k0d4ufhfac3hpxo3zsomsd9v9fvq2a
747774
747769
2026-06-20T21:33:06Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747774
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination)}}
rdyely6jha38cspq5i1jqtf8mfoayco
747777
747774
2026-06-20T21:33:53Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747777
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination) |date69=18 June 2026 |result69='''Redirect to [[Mergetest2]]''' |page69=Mergetest1 (2nd nomination)}}
9cgmo5yp71yoq9se61jwlq4t7d5dq04
747779
747777
2026-06-20T21:45:36Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747779
wikitext
text/x-wiki
{{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination) |date69=18 June 2026 |result69='''Redirect to [[Mergetest2]]''' |page69=Mergetest1 (2nd nomination) |date70=18 June 2026 |result70='''Redirect''' |page70=Mergetest1 (2nd nomination)}}
20yp9zyxiymutc5p2cnm625tf91knmc
747781
747779
2026-06-20T21:47:06Z
Trialpears
43074
Blanked the page
747781
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
747783
747781
2026-06-20T21:47:27Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747783
wikitext
text/x-wiki
{{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination)}}
rlqio3fgya91s4gr2297y5rdkf8o8z4
747785
747783
2026-06-20T21:48:48Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747785
wikitext
text/x-wiki
{{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination) |date2=18 June 2026 |result2='''Redirect''' |page2=Mergetest1 (2nd nomination)}}
lrbwdya4yhdharzwy9qso4aggc0aeoj
747787
747785
2026-06-20T21:51:02Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747787
wikitext
text/x-wiki
{{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination) |date2=18 June 2026 |result2='''Redirect''' |page2=Mergetest1 (2nd nomination) |date3=18 June 2026 |result3='''Redirect to [[Mergetest2]]''' |page3=Mergetest1 (2nd nomination)}}
d8w2bmb0q17ajfchlfahvd6cq7giyow
747788
747787
2026-06-20T21:51:26Z
Trialpears
43074
Blanked the page
747788
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
747791
747788
2026-06-20T21:51:46Z
Trialpears
43074
Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747791
wikitext
text/x-wiki
{{Old AfD multi |date=18 June 2026 |result='''merge into [[Mergetest2]]''' |page=Mergetest1 (2nd nomination)}}
3xo2sfik0i95k1r9h9phgh66ygc2t3p
Talk:Mergetest2
1
176336
747757
747646
2026-06-20T21:23:37Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]])
747757
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
d9drsaz8t3yus7tue5qp0cmkqv0852u
747761
747757
2026-06-20T21:25:09Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]])
747761
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
8nta8yqask40y8x6dvrds3e9uzltogz
747766
747761
2026-06-20T21:25:52Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747766
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
s0lbhlwrpxy9pdqo48cre4rxi9spvv9
747768
747766
2026-06-20T21:27:18Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747768
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
46xey42ykhdk9hbm5mcfb8aachey9ra
747772
747768
2026-06-20T21:33:06Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747772
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
nm3u8m8dswlnry74fczjiwjog372lg3
747792
747772
2026-06-20T21:51:46Z
Trialpears
43074
[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747792
wikitext
text/x-wiki
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
{{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}}
dlbbcmkudumhpospf6yu9qxn5lr1oa7
Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)
4
176383
747755
747643
2026-06-20T21:23:36Z
Trialpears
43074
/* Mergetest1 */ Closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]])
747755
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
lihxybogeoxx5r8b08bq9kv5b5vauz5
747759
747755
2026-06-20T21:25:08Z
Trialpears
43074
/* Mergetest1 */ Closed as merge ([[WP:XFDC#4.0.16|XFDcloser]])
747759
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
4nu0lvjzygvfda801vr29rot0qvy58o
747763
747759
2026-06-20T21:25:51Z
Trialpears
43074
/* Mergetest1 */ Closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747763
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
fotri0mal6kg6y187rvnxnge4k9c3xk
747767
747763
2026-06-20T21:27:17Z
Trialpears
43074
/* Mergetest1 */ Closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747767
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
dfbl5h85xgnkrb6jdzm7il2dc45wnc0
747771
747767
2026-06-20T21:33:05Z
Trialpears
43074
/* Mergetest1 */ Closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747771
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
oq2rem3xtcitwtmiqe0nbv46tkuliwm
747775
747771
2026-06-20T21:33:52Z
Trialpears
43074
/* Mergetest1 */ Closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]])
747775
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
5vpxajmby6p4op9mb4sylo4347evt28
747778
747775
2026-06-20T21:45:35Z
Trialpears
43074
/* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747778
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
2nzk64yphkhcsz2qylio0z0pfbva78b
747782
747778
2026-06-20T21:47:26Z
Trialpears
43074
/* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747782
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
df7obav3i5b8xoeaoih1uainhw8wh62
747784
747782
2026-06-20T21:48:47Z
Trialpears
43074
/* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747784
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
fhbs66265ljx93iih4la303t79m7etf
747786
747784
2026-06-20T21:51:02Z
Trialpears
43074
/* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]])
747786
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
sd855lmcklmqq0yrm7l2ue2ijigzcjr
747789
747786
2026-06-20T21:51:45Z
Trialpears
43074
/* Mergetest1 */ Closed as merge ([[WP:XFDC#4.0.16|XFDcloser]])
747789
wikitext
text/x-wiki
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC)
. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC)
to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC)
===[[:Mergetest1]]===
<div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div>
<noinclude>{{AFD help}}</noinclude>
:{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>)
:({{Find sources AFD|Mergetest1}})
I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC)
agb58m4nuldo38dxg28s31ddxzrlzi7
Wikipedia:Village Pump
4
176406
747667
2026-06-20T13:20:15Z
User97104
72884
User97104 moved page [[Wikipedia:Village Pump]] to [[Ikipedia:Illage Ump]]: Test: H
747667
wikitext
text/x-wiki
#REDIRECT [[Ikipedia:Illage Ump]]
{{Redirect category shell|
{{R from move}}
}}
68kgr2gkpiza66cykpkqeck75ant9tt
Template:禁制紀錄項目
10
176407
747668
2026-06-20T13:40:59Z
臺灣象象
71227
Import from the revision [[w:zh:Special:PermaLink/88096359|88096359]] of [[w:zh:模板:禁制紀錄項目]] edited by [[w:zh:Special:Contributions/1F616EMO|1F616EMO]] at 2025-07-04T23:25:32Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]]
747668
wikitext
text/x-wiki
<noinclude>{{NoteTA/MediaWiki}}
{| class=wikitable
! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間
</noinclude>
|-
| {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist">
* [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}|
* [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}|
* [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}|
* [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}|
* [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}|
* [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}|
* [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}|
* [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}}
</div>}}
| {{#switch:{{uc:{{{type|}}}}}
| P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制
| T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制
| I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制
| E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制
| R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制
| #default = {{{type}}}
}}
| {{{details|{{Error|請提供禁制範圍!}}}}}
| <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}}
{{{+links|}}}</div>
| <div class="hlist">
* {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}|
* {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}|
* {{禁制紀錄項目/sysop|{{{sysop3}}}}}}}
</div>
| {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}}
| <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}|
* {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}}
{{{updates|}}}</div><noinclude>
|}
{{doc}}
5onzledt77v76ccipnxyzou7s8vbqo5
747669
747668
2026-06-20T13:41:31Z
臺灣象象
71227
臺灣象象 moved page [[U:臺灣象象/banlogtemplate]] to [[User:臺灣象象/banlogtemplate]]
747668
wikitext
text/x-wiki
<noinclude>{{NoteTA/MediaWiki}}
{| class=wikitable
! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間
</noinclude>
|-
| {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist">
* [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}|
* [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}|
* [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}|
* [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}|
* [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}|
* [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}|
* [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}|
* [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}}
</div>}}
| {{#switch:{{uc:{{{type|}}}}}
| P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制
| T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制
| I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制
| E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制
| R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制
| #default = {{{type}}}
}}
| {{{details|{{Error|請提供禁制範圍!}}}}}
| <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}}
{{{+links|}}}</div>
| <div class="hlist">
* {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}|
* {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}|
* {{禁制紀錄項目/sysop|{{{sysop3}}}}}}}
</div>
| {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}}
| <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}|
* {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}}
{{{updates|}}}</div><noinclude>
|}
{{doc}}
5onzledt77v76ccipnxyzou7s8vbqo5
747671
747669
2026-06-20T13:43:09Z
臺灣象象
71227
臺灣象象 moved page [[User:臺灣象象/banlogtemplate]] to [[Template:Banlogtemplate]]: Test
747668
wikitext
text/x-wiki
<noinclude>{{NoteTA/MediaWiki}}
{| class=wikitable
! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間
</noinclude>
|-
| {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist">
* [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}|
* [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}|
* [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}|
* [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}|
* [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}|
* [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}|
* [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}|
* [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}}
</div>}}
| {{#switch:{{uc:{{{type|}}}}}
| P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制
| T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制
| I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制
| E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制
| R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制
| #default = {{{type}}}
}}
| {{{details|{{Error|請提供禁制範圍!}}}}}
| <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}}
{{{+links|}}}</div>
| <div class="hlist">
* {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}|
* {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}|
* {{禁制紀錄項目/sysop|{{{sysop3}}}}}}}
</div>
| {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}}
| <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}|
* {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}}
{{{updates|}}}</div><noinclude>
|}
{{doc}}
5onzledt77v76ccipnxyzou7s8vbqo5
747677
747671
2026-06-20T13:50:49Z
臺灣象象
71227
臺灣象象 moved page [[Template:Banlogtemplate]] to [[Template:禁制紀錄項目]]: Test
747668
wikitext
text/x-wiki
<noinclude>{{NoteTA/MediaWiki}}
{| class=wikitable
! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間
</noinclude>
|-
| {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist">
* [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}|
* [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}|
* [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}|
* [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}|
* [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}|
* [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}|
* [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}|
* [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}|
* [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}}
</div>}}
| {{#switch:{{uc:{{{type|}}}}}
| P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制
| T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制
| I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制
| E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制
| R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制
| #default = {{{type}}}
}}
| {{{details|{{Error|請提供禁制範圍!}}}}}
| <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}|
* {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}}
{{{+links|}}}</div>
| <div class="hlist">
* {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}|
* {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}|
* {{禁制紀錄項目/sysop|{{{sysop3}}}}}}}
</div>
| {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}}
| <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}|
* {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}}
{{{updates|}}}</div><noinclude>
|}
{{doc}}
5onzledt77v76ccipnxyzou7s8vbqo5
U:臺灣象象/banlogtemplate
0
176408
747670
2026-06-20T13:41:31Z
臺灣象象
71227
臺灣象象 moved page [[U:臺灣象象/banlogtemplate]] to [[User:臺灣象象/banlogtemplate]]
747670
wikitext
text/x-wiki
#REDIRECT [[User:臺灣象象/banlogtemplate]]
{{Redirect category shell|
{{R from move}}
}}
bv60phpap9pe1qhfak49v557w2mim0q
User:臺灣象象/banlogtemplate
2
176409
747672
2026-06-20T13:43:09Z
臺灣象象
71227
臺灣象象 moved page [[User:臺灣象象/banlogtemplate]] to [[Template:Banlogtemplate]]: Test
747672
wikitext
text/x-wiki
#REDIRECT [[Template:Banlogtemplate]]
{{Redirect category shell|
{{R from move}}
}}
0m30iklwd40cnbkyirxtajuyn9wum34
Banlog
0
176410
747673
2026-06-20T13:45:53Z
臺灣象象
71227
Created page with "{{User:臺灣象象/banlogtemplate |user=Example |start=200001010504 |endtext=無限期 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001012343 |end=202001022343 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202605080913 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202901020827 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001011534 |end=202606201900 }}"
747673
wikitext
text/x-wiki
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001010504
|endtext=無限期
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001012343
|end=202001022343
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=20000101
|end=202605080913
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=20000101
|end=202901020827
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001011534
|end=202606201900
}}
o23zyllogv9wpbmdjsv4jrmfa7usxaa
747674
747673
2026-06-20T13:47:09Z
臺灣象象
71227
747674
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001010504
|endtext=無限期
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001012343
|end=202001022343
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=20000101
|end=202605080913
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=20000101
|end=202901020827
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
fkmdj5tbomyvlfijym031239xl2y9kx
747675
747674
2026-06-20T13:49:05Z
臺灣象象
71227
747675
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{User:臺灣象象/banlogtemplate
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
njzank6u3yntznem8zipvbwijj3y3tm
747679
747675
2026-06-20T13:51:19Z
臺灣象象
71227
747679
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747685
747679
2026-06-20T14:38:11Z
臺灣象象
71227
臺灣象象 moved page [[User:臺灣象象/banlog]] to [[Banlog]]
747679
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747687
747685
2026-06-20T14:38:34Z
Twelephant-bot
74539
自動存檔已過期的禁制
747687
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747692
747687
2026-06-20T14:58:13Z
臺灣象象
71227
Undid revisions from [[Special:diff/747687|747687]] to [[Special:diff/747685|747685]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747692
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747693
747692
2026-06-20T15:05:56Z
Twelephant-bot
74539
自動存檔已過期的禁制
747693
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747694
747693
2026-06-20T15:08:26Z
臺灣象象
71227
Undid revision [[Special:diff/747693|747693]] by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747694
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747695
747694
2026-06-20T15:08:44Z
Twelephant-bot
74539
自動存檔已過期的禁制
747695
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747696
747695
2026-06-20T15:09:32Z
臺灣象象
71227
Restored revision 747692 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]): Test
747696
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747697
747696
2026-06-20T15:09:53Z
Twelephant-bot
74539
自動存檔已過期的禁制
747697
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747698
747697
2026-06-20T15:10:33Z
臺灣象象
71227
Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747698
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747699
747698
2026-06-20T15:10:45Z
Twelephant-bot
74539
自動存檔已過期的禁制
747699
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747700
747699
2026-06-20T15:11:54Z
臺灣象象
71227
Restored revision 747696 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]): Test (TwinkleGlobal)
747700
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747701
747700
2026-06-20T15:12:05Z
Twelephant-bot
74539
自動存檔已過期的禁制
747701
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747702
747701
2026-06-20T15:13:03Z
臺灣象象
71227
Undid revisions from [[Special:diff/747701|747701]] to [[Special:diff/747700|747700]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747702
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747703
747702
2026-06-20T15:13:15Z
Twelephant-bot
74539
自動存檔已過期的禁制
747703
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747704
747703
2026-06-20T15:14:13Z
臺灣象象
71227
Undid revisions from [[Special:diff/747703|747703]] to [[Special:diff/747702|747702]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747704
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747705
747704
2026-06-20T15:14:23Z
Twelephant-bot
74539
自動存檔已過期的禁制
747705
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747706
747705
2026-06-20T15:15:40Z
臺灣象象
71227
Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747706
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747707
747706
2026-06-20T15:15:52Z
Twelephant-bot
74539
自動存檔已過期的禁制
747707
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747708
747707
2026-06-20T15:16:55Z
臺灣象象
71227
Restored revision 747706 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]) (TwinkleGlobal)
747708
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747709
747708
2026-06-20T15:17:09Z
Twelephant-bot
74539
自動存檔已過期的禁制
747709
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747710
747709
2026-06-20T15:19:49Z
臺灣象象
71227
Undid revisions from [[Special:diff/747709|747709]] to [[Special:diff/747708|747708]]:test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747710
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747711
747710
2026-06-20T15:20:00Z
Twelephant-bot
74539
自動存檔已過期的禁制
747711
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747712
747711
2026-06-20T15:22:59Z
臺灣象象
71227
Undid revisions from [[Special:diff/747711|747711]] to [[Special:diff/747710|747710]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747712
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747713
747712
2026-06-20T15:23:09Z
Twelephant-bot
74539
自動存檔已過期的禁制
747713
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747714
747713
2026-06-20T15:25:00Z
臺灣象象
71227
Undid revisions from [[Special:diff/747713|747713]] to [[Special:diff/747712|747712]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747714
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747715
747714
2026-06-20T15:25:09Z
Twelephant-bot
74539
自動存檔已過期的禁制
747715
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747716
747715
2026-06-20T15:26:23Z
臺灣象象
71227
Undid revisions from [[Special:diff/747715|747715]] to [[Special:diff/747714|747714]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747716
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747717
747716
2026-06-20T15:26:37Z
Twelephant-bot
74539
自動存檔已過期的禁制
747717
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747719
747717
2026-06-20T15:27:23Z
臺灣象象
71227
Undid revisions from [[Special:diff/747717|747717]] to [[Special:diff/747716|747716]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747719
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747720
747719
2026-06-20T15:27:36Z
Twelephant-bot
74539
自動存檔已過期的禁制
747720
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747722
747720
2026-06-20T15:29:50Z
臺灣象象
71227
Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]) // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]]
747722
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
4q5et0k3qtv4zo7j78jh93e6y37ebyp
747723
747722
2026-06-20T15:30:09Z
臺灣象象
71227
747723
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202101022343
}}
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
cktk58blatnebqqz461i4tolzuzpz6e
747724
747723
2026-06-20T15:30:24Z
Twelephant-bot
74539
自動存檔已過期的禁制
747724
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202901020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
aq1f1twimdk2imq5c6f05keswbknc9y
747727
747724
2026-06-20T15:31:11Z
臺灣象象
71227
747727
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202401020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201900
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
hcb84yl41nhau8r1syhk1iouwl3ajr5
747728
747727
2026-06-20T15:31:38Z
臺灣象象
71227
747728
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202401020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
407xgkzuclj30n2scej9fgv0am4rfy0
747730
747728
2026-06-20T15:33:44Z
臺灣象象
71227
747730
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202501020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
hsjghth7l919ac0e2lbn08nrvpolwnj
747732
747730
2026-06-20T15:41:16Z
臺灣象象
71227
747732
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202501020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
3wl42kmj8biog0idkgyab0psi0xdyds
747735
747732
2026-06-20T15:42:28Z
臺灣象象
71227
747735
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202501020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202506201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=201406201300
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
oko4dcu3a00qxcniy2f1vzftrvdskqf
747736
747735
2026-06-20T15:42:40Z
臺灣象象
71227
747736
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202501020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202506201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=201406201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=201406201300
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
cw1j3w73e5a9zl1mr72ec5nuf3fmjm7
747740
747736
2026-06-20T15:42:56Z
Twelephant-bot
74539
自動存檔已過期的禁制
747740
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
fntmle6lozz1qomrkk4soc66oj7pa3u
747741
747740
2026-06-20T15:45:05Z
臺灣象象
71227
747741
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201810101010
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201810101010
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201910101010
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201910101010
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
24sy67y6l358bzlif77yee8jh20a9jq
747744
747741
2026-06-20T15:46:38Z
Twelephant-bot
74539
自動存檔已過期的禁制
747744
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
34jzymeau3tl5xjwo4bvhbi9piodry7
747749
747744
2026-06-20T16:17:03Z
臺灣象象
71227
747749
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=200010102301
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
5fwlaaysufondly5iz55w0wyuoy9giu
747751
747749
2026-06-20T16:20:22Z
Twelephant-bot
74539
自動存檔已過期的禁制
747751
wikitext
text/x-wiki
{{pp-protected|small=yes}}
{{NoteTA/MediaWiki}}
{{佈告板連結|state=collapsed}}
{{shortcut|WP:BANLOG}}
此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。
{{clear}}
== 實施中 ==
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|endtext=無限期
}}
|}
<!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 -->
== [[/存檔/]] ==
{{/存檔}}
[[Category:维基百科禁制]]
palr4qa52v2kkjl4g0d6kexeiqq5tq4
Template:禁制紀錄項目/sysop
10
176411
747676
2026-06-20T13:49:35Z
臺灣象象
71227
Import from the revision [[w:zh:Special:PermaLink/88096337|88096337]] of [[w:zh:Template:禁制紀錄項目/sysop]] edited by [[w:zh:Special:Contributions/1F616EMO|1F616EMO]] at 2025-07-04T23:24:03Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]]
747676
wikitext
text/x-wiki
{{#switch:{{{1}}}
|仲裁委員會|仲裁委员会=[[WP:仲裁委員會|仲裁委員會]]
|#default=[[U:{{{1}}}|-{{{{1}}}}-]]
}}
c5o2esk5gvlhdkbownq5bpxcv4u9e6r
Template:Banlogtemplate
10
176412
747678
2026-06-20T13:50:49Z
臺灣象象
71227
臺灣象象 moved page [[Template:Banlogtemplate]] to [[Template:禁制紀錄項目]]: Test
747678
wikitext
text/x-wiki
#REDIRECT [[Template:禁制紀錄項目]]
{{Redirect category shell|
{{R from move}}
}}
rqu4bc7ov2o8q3fnwx265nhnfzx0jfk
User:97104-Test
2
176413
747683
2026-06-20T14:07:49Z
97104-Test
74540
Created page with "This is User97104's new account for testing. (See [[User:User97104]] here to verify)"
747683
wikitext
text/x-wiki
This is User97104's new account for testing. (See [[User:User97104]] here to verify)
tecr26vx5m86aafwqsd9y7x1am6accv
User:臺灣象象/banlog
2
176414
747686
2026-06-20T14:38:11Z
臺灣象象
71227
臺灣象象 moved page [[User:臺灣象象/banlog]] to [[Banlog]]
747686
wikitext
text/x-wiki
#REDIRECT [[Banlog]]
{{Redirect category shell|
{{R from move}}
}}
3gsl6fbs2xrq2wcij29uinttjgifirh
Talk:News
1
176415
747690
2026-06-20T14:47:55Z
97104-Test
74540
/* h */ new section
747690
wikitext
text/x-wiki
== h ==
@[[User:AutoModeratorTest|AutoModeratorTest]] [[User:97104-Test|97104-Test]] ([[User talk:97104-Test|talk]]) 14:47, 20 June 2026 (UTC)
7s4e4rfpxo5qn554ep2kmfxowj7q8xv
Banlog/存檔/2020年
0
176416
747718
2026-06-20T15:26:39Z
Twelephant-bot
74539
自動存檔已過期的禁制
747718
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
0ef6kxup9gnmdwgzlchnou6omjzo7nk
747721
747718
2026-06-20T15:27:38Z
Twelephant-bot
74539
自動存檔已過期的禁制
747721
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202001022343
}}
fj5mf0ydgglpj2y8zb0vj122p4euwn3
Banlog/存檔/2021年
0
176417
747725
2026-06-20T15:30:26Z
Twelephant-bot
74539
自動存檔已過期的禁制
747725
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>
{{禁制紀錄項目
|user=Example
|start=200001012343
|type=頁面禁制
|details=破壞
|sysop=Example
|end=202101022343
}}
d250iky4yxol5zih9pt3wpwfqpvs8dp
Banlog/存檔/2026年
0
176418
747726
2026-06-20T15:30:27Z
Twelephant-bot
74539
自動存檔已過期的禁制
747726
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}
jww4p0y55dqhgqmxfjrl3bktqjtgdu2
747737
747726
2026-06-20T15:42:52Z
Twelephant-bot
74539
自動存檔已過期的禁制
747737
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>
{{禁制紀錄項目
|user=Example
|start=20000101
|end=202605080913
|type=頁面禁制
|details=破壞
|sysop=Example
}}{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202606201300
}}
pgxl1wrlg9cvdo8v0vinwtmtevo9zi1
Banlog/存檔/2024年
0
176419
747729
2026-06-20T15:31:47Z
Twelephant-bot
74539
自動存檔已過期的禁制
747729
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202401020827
}}
rrct1zbsp2mke85gzh4ho7wryjbxlrg
User:Twelephant-bot/task/3/config.json
2
176420
747731
2026-06-20T15:35:47Z
Twelephant-bot
74539
Created page with "{"pageid":"176410", "banlogtemplate":"禁制紀錄項目", "banlogarchivepageheader":"<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>", "banlogarchivepagetitleformat":"%s/存檔/%d年"}"
747731
json
application/json
{
"pageid": "176410",
"banlogtemplate": "禁制紀錄項目",
"banlogarchivepageheader": "\u003Cnoinclude\u003E{{Wikipedia:禁制紀錄/存檔/header}}\u003C/noinclude\u003E",
"banlogarchivepagetitleformat": "%s/存檔/%d年"
}
25mpbu5f4tstbuw2mhtmmdds1ao8xwk
747734
747731
2026-06-20T15:41:52Z
Twelephant-bot
74539
747734
json
application/json
{
"pageid": "176410",
"banlogtemplate": "禁制紀錄項目",
"banlogarchivepageheader": "\u003Cnoinclude\u003E{{Banlog/header}}\u003C/noinclude\u003E",
"banlogarchivepagetitleformat": "%s/存檔/%d年"
}
08svvhqrlhl19t9rh3bto74coz01c8m
747748
747734
2026-06-20T16:16:17Z
Twelephant-bot
74539
747748
json
application/json
{
"pageid": "176410",
"archivemainpageid": "176427",
"banlogtemplate": "禁制紀錄項目",
"banlogarchivepageheader": "\u003Cnoinclude\u003E{{Banlog/header}}\u003C/noinclude\u003E",
"banlogarchivepagetitleformat": "%s/存檔/%d年",
"banlogarchivemainpageoldformat": "!colspan=7 | %s",
"banlogarchivemainpagenewformat": "\n|-\n{{%s}}"
}
mhc1pfwa1j8x742gtblrk2h49pjrkbr
Template:Banlog/header
10
176421
747733
2026-06-20T15:41:46Z
臺灣象象
71227
Import from the revision [[w:zh:Special:PermaLink/78141345|78141345]] of [[w:zh:Wikipedia:禁制紀錄/存檔/header]] edited by [[w:zh:Special:Contributions/LuciferianThomas|LuciferianThomas]] at 2023-07-19T01:48:58Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]]
747733
wikitext
text/x-wiki
此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
7f55hugybmvi59ryfq9w6rsxbt1grkr
747745
747733
2026-06-20T15:47:14Z
臺灣象象
71227
臺灣象象 moved page [[Banlog/header]] to [[Template:Banlog/header]]
747733
wikitext
text/x-wiki
此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
7f55hugybmvi59ryfq9w6rsxbt1grkr
Banlog/存檔/2025年
0
176422
747738
2026-06-20T15:42:54Z
Twelephant-bot
74539
自動存檔已過期的禁制
747738
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|start=20000101
|details=破壞
|end=202501020827
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=202506201300
}}
t85byl3gx4ubk445zuehd6agcx15oiw
Banlog/存檔/2014年
0
176423
747739
2026-06-20T15:42:55Z
Twelephant-bot
74539
自動存檔已過期的禁制
747739
wikitext
text/x-wiki
<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=201406201300
}}
{{禁制紀錄項目
|user=Example
|type=頁面禁制
|sysop=Example
|details=破壞
|start=200001011534
|end=201406201300
}}
1vcevpfqc9lubisswobbx8td7gj877l
Banlog/存檔/2018年
0
176424
747742
2026-06-20T15:46:35Z
Twelephant-bot
74539
自動存檔已過期的禁制
747742
wikitext
text/x-wiki
<noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201810101010
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201810101010
}}
1yv6k8j2iolbunhza8qdp5pyqzfq258
Banlog/存檔/2019年
0
176425
747743
2026-06-20T15:46:37Z
Twelephant-bot
74539
自動存檔已過期的禁制
747743
wikitext
text/x-wiki
<noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201910101010
}}
{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=201910101010
}}
osib2imyi1cuvj5d0340adbg0a4vbvm
Banlog/header
0
176426
747746
2026-06-20T15:47:14Z
臺灣象象
71227
臺灣象象 moved page [[Banlog/header]] to [[Template:Banlog/header]]
747746
wikitext
text/x-wiki
#REDIRECT [[Template:Banlog/header]]
{{Redirect category shell|
{{R from move}}
}}
gnlvfyq5slodhbjzca9pqgp9apprn0m
Banlog/存檔
0
176427
747747
2026-06-20T16:15:35Z
臺灣象象
71227
Import from the revision [[w:zh:Special:PermaLink/90998103|90998103]] of [[w:zh:Wikipedia:禁制紀錄/存檔]] edited by [[w:zh:Special:Contributions/臺灣象象|臺灣象象]] at 2026-01-05T12:49:21Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]]
747747
wikitext
text/x-wiki
<noinclude>此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。</noinclude>
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2018年|2018年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2019年|2019年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2020年|2020年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2021年|2021年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2022年|2022年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2023年|2023年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2024年|2024年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2025年|2025年]]
|-
!colspan=7 | [[Wikipedia:禁制紀錄/存檔/2026年|2026年]]
|-
{{Wikipedia:禁制紀錄/存檔/2026年}}
nxo276t1dwslvahogul0iskjq3kis0h
747752
747747
2026-06-20T16:20:23Z
Twelephant-bot
74539
自動更新禁制存檔列表
747752
wikitext
text/x-wiki
<noinclude>此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。</noinclude>
{| class="wikitable plainrowheaders sortable" style="width: 100%;"
|-
! scope="col" style="width:15%" | 用戶名
! scope="col" style="width:60px" | 禁制類型
! scope="col" class="unsortable" style="width:30%" | 禁制說明
! scope="col" class="unsortable" style="width:60px" | 相關討論
! scope="col" | 執行者
! scope="col" | 開始時間
! scope="col" | 結束時間
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2018年|2018年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2019年|2019年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2020年|2020年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2021年|2021年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2022年|2022年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2023年|2023年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2024年|2024年]]
|-
! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2025年|2025年]]
|-
!colspan=7 | [[Wikipedia:禁制紀錄/存檔/2026年|2026年]]
|-
!colspan=7 | {{Wikipedia:禁制紀錄/存檔/2026年}}
|-
{{Banlog/存檔/2000年}}
07k62r0ek9p6ko4inm5lbnfzhesy601
Banlog/存檔/2000年
0
176428
747750
2026-06-20T16:20:21Z
Twelephant-bot
74539
自動存檔已過期的禁制
747750
wikitext
text/x-wiki
<noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目
|user=Example
|start=200001010504
|details=破壞
|type=頁面禁制
|sysop=Example
|end=200010102301
}}
0f3tdx00ubsz5w11znzfqvphzvvuj7v
Wikipedia:Good articles/
4
176429
747797
2026-06-20T22:40:23Z
97104-Test
74540
Created page with "tewttt e ũeu"
747797
wikitext
text/x-wiki
tewttt e ũeu
mvv0tz2e9x5nd8y1zx8f2ysmukuvd1o