<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://www.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-DeluxeHistory.js</id>
	<title>مدیاویکی:Gadget-DeluxeHistory.js - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://www.islamical.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-DeluxeHistory.js"/>
	<link rel="alternate" type="text/html" href="https://www.islamical.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-DeluxeHistory.js&amp;action=history"/>
	<updated>2026-06-09T21:45:58Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://www.islamical.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-DeluxeHistory.js&amp;diff=354&amp;oldid=prev</id>
		<title>Aboammar: صفحه‌ای تازه حاوی «/**  * Nom : DeluxeHistory  * Implémentation originale de Dake, basée sur du code Ajax de GôTô  * Réécriture complète par Dr Brains et Od1n, avec améliorations de Ltrlg  *  * {{Catégorisation JS|DeluxeHistory}}  */  /*global mw, $ */  // La dépendance &#039;user&#039; assure le chargement du common.js utilisateur avant ce script, pour la configuration.  mw.loader.using([&#039;user&#039;, &#039;user.options&#039;, &#039;mediawiki.api&#039;, &#039;mediawiki.storage&#039;], fun...» ایجاد کرد</title>
		<link rel="alternate" type="text/html" href="https://www.islamical.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-DeluxeHistory.js&amp;diff=354&amp;oldid=prev"/>
		<updated>2023-01-12T17:25:51Z</updated>

		<summary type="html">&lt;p&gt;صفحه‌ای تازه حاوی «&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;*  * Nom : DeluxeHistory  * Implémentation originale de Dake, basée sur du code Ajax de GôTô  * Réécriture complète par Dr Brains et Od1n, avec améliorations de Ltrlg  *  * {{Catégorisation JS|DeluxeHistory}}: &lt;/span&gt;  &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;global mw, $: &lt;/span&gt;  // La dépendance &amp;#039;user&amp;#039; assure le chargement du common.js utilisateur avant ce script, pour la configuration.  mw.loader.using([&amp;#039;user&amp;#039;, &amp;#039;user.options&amp;#039;, &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;], fun...» ایجاد کرد&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * Nom : DeluxeHistory&lt;br /&gt;
 * Implémentation originale de Dake, basée sur du code Ajax de GôTô&lt;br /&gt;
 * Réécriture complète par Dr Brains et Od1n, avec améliorations de Ltrlg&lt;br /&gt;
 *&lt;br /&gt;
 * {{Catégorisation JS|DeluxeHistory}}&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*global mw, $ */&lt;br /&gt;
&lt;br /&gt;
// La dépendance &amp;#039;user&amp;#039; assure le chargement du common.js utilisateur avant ce script, pour la configuration.&lt;br /&gt;
&lt;br /&gt;
mw.loader.using([&amp;#039;user&amp;#039;, &amp;#039;user.options&amp;#039;, &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.storage&amp;#039;], function () {&lt;br /&gt;
	$(function ($) {&lt;br /&gt;
		&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		var $content = $(&amp;#039;#mw-content-text&amp;#039;);&lt;br /&gt;
		var botMembers, sysopMembers;&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// LOCALSTORAGE ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		function storageGet(key) {&lt;br /&gt;
			var lastUpdate = mw.storage.get(&amp;#039;HistoryDeluxe_&amp;#039; + key + &amp;#039;_lastUpdate&amp;#039;);&lt;br /&gt;
			if (lastUpdate) {&lt;br /&gt;
				// cacheAge ne peut théoriquement pas être négatif, mais si jamais cela arrive (problème d&amp;#039;horloge)&lt;br /&gt;
				// le test &amp;quot;cacheAge &amp;gt; 0&amp;quot; permet de ne pas se retrouver avec un cache indéfiniment valide&lt;br /&gt;
				var cacheAge = Date.now() - lastUpdate;&lt;br /&gt;
				if (cacheAge &amp;lt; 1000 * 3600 * 24 &amp;amp;&amp;amp; cacheAge &amp;gt; 0) {&lt;br /&gt;
					return mw.storage.get(&amp;#039;HistoryDeluxe_&amp;#039; + key);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function storageSet(key, value) {&lt;br /&gt;
			mw.storage.set(&amp;#039;HistoryDeluxe_&amp;#039; + key, value);&lt;br /&gt;
			mw.storage.set(&amp;#039;HistoryDeluxe_&amp;#039; + key + &amp;#039;_lastUpdate&amp;#039;, Date.now());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// RÉCUPÉRATION DE LA LISTE DES BOTS ET SYSOPS ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		function getUserList(group) {&lt;br /&gt;
			var storedValue = storageGet(group);&lt;br /&gt;
			return storedValue ? storedValue.split(&amp;#039;|&amp;#039;) : null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function updateUserList(group, doneCallback, userList, userContinue) {&lt;br /&gt;
			if (!userList) { userList = []; }&lt;br /&gt;
&lt;br /&gt;
			var paramUserGroups = mw.config.get(&amp;#039;wgUserGroups&amp;#039;);&lt;br /&gt;
			var APILimit = paramUserGroups.indexOf(&amp;#039;sysop&amp;#039;) &amp;gt; -1 || paramUserGroups.indexOf(&amp;#039;bot&amp;#039;) &amp;gt; -1&lt;br /&gt;
				? 5000 : 500;&lt;br /&gt;
			var params = {&lt;br /&gt;
				&amp;#039;action&amp;#039;  : &amp;#039;query&amp;#039;,&lt;br /&gt;
				&amp;#039;list&amp;#039;    : &amp;#039;allusers&amp;#039;,&lt;br /&gt;
				&amp;#039;aulimit&amp;#039; : APILimit,&lt;br /&gt;
				&amp;#039;augroup&amp;#039; : group,&lt;br /&gt;
			};&lt;br /&gt;
			if (userContinue) {&lt;br /&gt;
				$.extend(params, userContinue);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			new mw.Api()&lt;br /&gt;
				.get(params)&lt;br /&gt;
				.done(function (data) {&lt;br /&gt;
					$.each(data.query.allusers, function () {&lt;br /&gt;
						userList.push(this.name);&lt;br /&gt;
					});&lt;br /&gt;
					if (data[&amp;#039;continue&amp;#039;]) {&lt;br /&gt;
						updateUserList(group, doneCallback, userList, data[&amp;#039;continue&amp;#039;]);&lt;br /&gt;
					} else {&lt;br /&gt;
						storageSet(group, userList.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
						if (group === &amp;#039;bot&amp;#039;) {&lt;br /&gt;
							botMembers = userList;&lt;br /&gt;
						} else if (group === &amp;#039;sysop&amp;#039;) {&lt;br /&gt;
							sysopMembers = userList;&lt;br /&gt;
						}&lt;br /&gt;
						doneCallback();&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// FONCTION DE TRAITEMENT DES LIENS ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		function userGroupClassName($lis) {&lt;br /&gt;
			var nsSpecial = mw.config.get(&amp;#039;wgFormattedNamespaces&amp;#039;)[-1] + &amp;#039;:&amp;#039;;&lt;br /&gt;
			var watcherName = mw.config.get(&amp;#039;wgUserName&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			function isUserIP(userlink) {&lt;br /&gt;
				// Les liens des IP sont de la forme « Spécial:Contributions/&amp;lt;IP&amp;gt; »&lt;br /&gt;
				return userlink.title.indexOf(nsSpecial) === 0;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			function getUserClass(userlink) {&lt;br /&gt;
				var UserName = userlink.textContent;&lt;br /&gt;
				if (UserName === watcherName) { return &amp;#039;UserIs-Self&amp;#039;; }&lt;br /&gt;
				if (botMembers.indexOf(UserName) &amp;gt; -1) { return &amp;#039;UserIs-Bot&amp;#039;; }&lt;br /&gt;
				if (sysopMembers.indexOf(UserName) &amp;gt; -1) { return &amp;#039;UserIs-Sysop&amp;#039;; }&lt;br /&gt;
				if (isUserIP(userlink)) { return &amp;#039;UserIs-IP&amp;#039;; }&lt;br /&gt;
				return &amp;#039;UserIs-User&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Renvoie &amp;#039;UserIs-…&amp;#039; si un seul type, &amp;#039;UserIs-Mixed&amp;#039; sinon (RC &amp;quot;améliorée&amp;quot;).&lt;br /&gt;
			// Colore les liens vers les utilisateurs pour disposer de la différentiation même si historique mixte.&lt;br /&gt;
			function getMultipleClassName(userlinks) {&lt;br /&gt;
				var className = &amp;#039;&amp;#039;;&lt;br /&gt;
				$.each(userlinks, function () {&lt;br /&gt;
					var localClassName = getUserClass(this);&lt;br /&gt;
					this.classList.add(localClassName);&lt;br /&gt;
					if (className === &amp;#039;&amp;#039;) {&lt;br /&gt;
						className = localClassName;&lt;br /&gt;
					} else if (className !== localClassName) {&lt;br /&gt;
						className = &amp;#039;UserIs-Mixed&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
				return className;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$lis.each(function () {&lt;br /&gt;
				var userlinks = this.getElementsByClassName(&amp;#039;mw-userlink&amp;#039;);&lt;br /&gt;
				if (userlinks.length === 1) {&lt;br /&gt;
					this.classList.add(getUserClass(userlinks[0]));&lt;br /&gt;
				} else if (userlinks.length &amp;gt; 1) {  // groupe des RC &amp;quot;améliorées&amp;quot;&lt;br /&gt;
					this.classList.add(getMultipleClassName(userlinks));&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// FONCTIONS DE PARCOURS DES ÉLÉMENTS ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		function scan_first_ul() {&lt;br /&gt;
			userGroupClassName($content.find(&amp;#039;ul&amp;#039;).eq(0).find(&amp;#039;li&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function scan_ul_special_li() {&lt;br /&gt;
			userGroupClassName($content.find(&amp;#039;ul.special li&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function scan_td() {&lt;br /&gt;
			userGroupClassName($content.find(&amp;#039;td&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// FONCTIONS DE SÉLECTION DES FILTRES ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		function process_History() {&lt;br /&gt;
			userGroupClassName($content.find(&amp;#039;#pagehistory, .flow-board-history&amp;#039;).find(&amp;#039;li&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_Watchlist() {&lt;br /&gt;
			if (mw.user.options.get(&amp;#039;usenewrc&amp;#039;)) {&lt;br /&gt;
				scan_td(); // Liste de suivi &amp;quot;améliorée&amp;quot;&lt;br /&gt;
			} else {&lt;br /&gt;
				scan_ul_special_li(); // Liste de suivi normale&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_Recentchanges() {&lt;br /&gt;
			if (mw.user.options.get(&amp;#039;usenewrc&amp;#039;)) {&lt;br /&gt;
				scan_td(); // RC &amp;quot;améliorées&amp;quot;&lt;br /&gt;
			} else {&lt;br /&gt;
				scan_ul_special_li(); // RC normales&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_Recentchangeslinked() {&lt;br /&gt;
			if (mw.user.options.get(&amp;#039;usenewrc&amp;#039;)) {&lt;br /&gt;
				scan_td(); // RC liées &amp;quot;améliorées&amp;quot;&lt;br /&gt;
			} else {&lt;br /&gt;
				scan_ul_special_li(); // RC liées normales&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_Newpages() {&lt;br /&gt;
			scan_first_ul();&lt;br /&gt;
			mw.loader.addStyleTag(&amp;#039;.not-patrolled { text-decoration: underline; }&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_Log() {&lt;br /&gt;
			scan_first_ul();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_AbuseLog() {&lt;br /&gt;
			scan_first_ul();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function process_OtherPages() {&lt;br /&gt;
			scan_ul_special_li();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// LANCEMENTS ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		var classesApplied = false;&lt;br /&gt;
		var classesCallback;&lt;br /&gt;
&lt;br /&gt;
		function applyClasses() {&lt;br /&gt;
			if (botMembers &amp;amp;&amp;amp; sysopMembers &amp;amp;&amp;amp; !classesApplied) {&lt;br /&gt;
				classesApplied = true;&lt;br /&gt;
				classesCallback();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function processIfEnabled(pageType, callback) {&lt;br /&gt;
			var enabled = $.extend({&lt;br /&gt;
				&amp;#039;history&amp;#039;: true,&lt;br /&gt;
				&amp;#039;watchlist&amp;#039;: true,&lt;br /&gt;
				&amp;#039;recentchanges&amp;#039;: true,&lt;br /&gt;
				&amp;#039;recentchangeslinked&amp;#039;: true,&lt;br /&gt;
				&amp;#039;newpages&amp;#039;: true,&lt;br /&gt;
				&amp;#039;log&amp;#039;: true,&lt;br /&gt;
				&amp;#039;abuseLog&amp;#039;: true,&lt;br /&gt;
				&amp;#039;other&amp;#039;: true&lt;br /&gt;
			}, window.DeluxeHistory_Enabled);&lt;br /&gt;
&lt;br /&gt;
			if (enabled[pageType]) {&lt;br /&gt;
				if (!mw.user.options.get(&amp;#039;gadget-DeluxeHistory&amp;#039;)) {&lt;br /&gt;
					mw.loader.load(&amp;#039;/w/index.php?title=MediaWiki:Gadget-DeluxeHistory.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;#039;, &amp;#039;text/css&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				classesCallback = callback;&lt;br /&gt;
&lt;br /&gt;
				botMembers = getUserList(&amp;#039;bot&amp;#039;);&lt;br /&gt;
				if (!botMembers) {&lt;br /&gt;
					updateUserList(&amp;#039;bot&amp;#039;, applyClasses);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				sysopMembers = getUserList(&amp;#039;sysop&amp;#039;);&lt;br /&gt;
				if (!sysopMembers) {&lt;br /&gt;
					updateUserList(&amp;#039;sysop&amp;#039;, applyClasses);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				applyClasses();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/////////////////////////////////////// INITIALISATION ///////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
		var paramAction = mw.config.get(&amp;#039;wgAction&amp;#039;);&lt;br /&gt;
		var paramCanonicalSpecialPageName = mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		if (paramAction === &amp;#039;history&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;history&amp;#039;, process_History);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;Watchlist&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;watchlist&amp;#039;, process_Watchlist);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;Recentchanges&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;recentchanges&amp;#039;, process_Recentchanges);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;Recentchangeslinked&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;recentchangeslinked&amp;#039;, process_Recentchangeslinked);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;Newpages&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;newpages&amp;#039;, process_Newpages);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;Log&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;log&amp;#039;, process_Log);&lt;br /&gt;
&lt;br /&gt;
		} else if (paramCanonicalSpecialPageName === &amp;#039;AbuseLog&amp;#039;) {&lt;br /&gt;
			processIfEnabled(&amp;#039;abuseLog&amp;#039;, process_AbuseLog);&lt;br /&gt;
&lt;br /&gt;
		} else if ($content.find(&amp;#039;.special&amp;#039;).length) {&lt;br /&gt;
			processIfEnabled(&amp;#039;other&amp;#039;, process_OtherPages);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	});&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Aboammar</name></author>
	</entry>
</feed>