SpecialVersion.js – MediaWiki

From Bohemia Interactive Community
Jump to navigation Jump to search
(Groan...)
(Almost done)
 
(7 intermediate revisions by the same user not shown)
Line 10: Line 10:
  */
  */


var foo = ""; // Every script needs a "foo"
// All tables on "Special:Version"
var tbls = document.getElementsByTagName( "table" );


/*****************************************************************************************
/*****************************************************************************************
Line 18: Line 19:


function checkExtensionVersions() {
function checkExtensionVersions() {
var tbls = document.getElementsByTagName( "table" ),
var mwve = tbls[0].getElementsByTagName( "tr" )[1].getElementsByTagName( "td" )[1],
mw_version = tbls[0].getElementsByTagName( "tr" )[1].getElementsByTagName( "td" )[1].textContent,
exts = tbls[2].getElementsByTagName( "em" ),
exts = tbls[2].getElementsByTagName( "em" );
mwaddr = "www.mediawiki.org",
mwcurv = mwve.textContent,
extso = {};
extso = {};
fetchData = function( ns, n, fnc ) {
$.ajax( {
url: "https://" + mwaddr + "/w/api.php",
data: {
action: "query",
prop: "revisions",
rvprop: "content",
titles: ns + n,
format: "json",
redirects: ""
},
dataType: "jsonp",
success: function( data ) {
var pgs = data.query.pages;
for ( var pg in pgs ) {
if ( pgs[pg].hasOwnProperty( "revisions" ) ) {
var ttl = !!data.query.redirects ? data.query.redirects[0].from : pgs[pg].title;
fnc( pgs[pg].revisions[0]["*"], ttl.replace( / /g, "_" ).replace( ns, "" ).toLowerCase() );
break;
}
}
}
} );
};
fetchData(
"Template:",
"MW_stable_branch_number",
function( txt, ttl ) {
var mwlurv = txt.substring( 0, txt.indexOf( "<noinclude>" ) ).trim(),
mwrnaddr = "Release_notes/" + mwlurv;
if ( mwlurv > mwcurv ) {
fetchData(
"",
mwrnaddr,
function( txt, ttl ) {
var mwcmpt = /={2,}\s*compatibility\s*={2,}([^]+)={2,}\s*[\w]+\s*={2,}/i.exec( txt );
if ( !!mwcmpt ) {
mwve.innerHTML = "Current version: " + mwcurv +
"<br><b><span style='color:#0a0;'>Latest stable version: " + mwlurv + "</span>" +
"<br>Compatibility <a href='https://" + mwaddr + "/wiki/" + mwrnaddr + "'>release notes for " + mwlurv + "</a>:</b>" +
"<p style='margin-left:1em;white-space:pre-wrap;'>" + mwcmpt[1].trim() + "</p>";
}
}
);
}
}
);
for ( var ext in exts ) {
for ( var ext in exts ) {
if ( typeof exts[ext] == "object" ) {
if ( typeof exts[ext] == "object" ) {
Line 27: Line 76:
if ( ev[0] ) {
if ( ev[0] ) {
var en;
var en;
if ( exts[ext].firstChild.nodeType === Node.ELEMENT_NODE ) {
if ( exts[ext].firstChild.nodeType === Node.ELEMENT_NODE && exts[ext].firstChild.hasAttribute( "href" ) ) {
en = exts[ext].firstChild.getAttribute( "href" );
en = exts[ext].firstChild.getAttribute( "href" );
en = en.substring( en.indexOf( "Extension:" ) + 10 );
if ( en.indexOf( mwaddr ) > 0 ) {
en = en.substring( en.indexOf( "Extension:" ) + 10 );
} else {
en = exts[ext].firstChild.textContent.trim();
}
} else {
} else {
en = exts[ext].textContent;
en = exts[ext].firstChild.textContent.trim();
}
}
extso[en] = [
extso[en.toLowerCase().replace( / /g, "_" )] = [
exts[ext],
exts[ext],
ev[0].textContent.replace( /[^0-9\.\s]/g, "" ).trim()
ev[0].textContent.replace( /[^\d\. ]/g, "" ).trim()
];
];
$.ajax( {
fetchData(
url: "https://www.mediawiki.org/w/api.php",
"Extension:",
data: {
en,
action: "query",
function( txt, ttl ) {
prop: "revisions",
var curv = extso[ttl][1],
rvprop: "content",
stts = /\|\s*status\s*=\s*(.+)\s*\|/i.exec( txt ),
titles: "Extension:" + encodeURIComponent( en ),
lurv = /\|\s*version\s*=\s*(.+)\s*\|/i.exec( txt ),
format: "json"
bndl = [];
},
if ( !!stts && !!lurv ) {
dataType: "jsonp",
stts = stts[1].toLowerCase();
success: function( data ) {
lurv = lurv[1].replace( /<.*>/g, "" ).trim();
var pgs = data.query.pages;
bndl = /\|.*(?=\bbundled\b).*(?=\bmediawiki\b).*(?=\s([\d\.]+)).*/i.exec( txt );
for ( var pg in pgs ) {
} else {
if ( pgs[pg].hasOwnProperty( "revisions" ) ) {
bndl = /\s*\{\{\s*archived(?: |_)extension\s*\|\s*\d+\s*\|\s*reason\s*=.*(?=\bmerged\b).*(?=\bcore\b).*(?=\bmediawiki\b).*(?=\bversion\s*([\d\.]+)).*/i.exec( txt );
var txt = pgs[pg].revisions[0]["*"],
}
ttl = pgs[pg].title.replace( " ", "_" ).replace( "Extension:", "" ),
if ( !!bndl ) {
curv = extso[ttl][1];
stts = "bundled since";
txt = txt.substring( txt.indexOf( "|version" ) + 8 );
lurv = bndl[1].replace(/[^\d]*$/g, "");
txt = txt.substring( 0, txt.indexOf( "|" ) ).replace( /[^0-9\.\s]/g, "" ).trim() || "Continuous updates";
curv = mwcurv;
if ( curv != txt ) {
}
extso[ttl][0].innerHTML += "<br><span style='color:red;'>" + txt + " available</span>";
if ( lurv != curv ) { // todo: latest version is greater than current version
}
extso[ttl][0].innerHTML += "<br><span style='color:" + (
}
stts === "unmaintained" ? "#aaa;" :
stts === "archive" ? "#aaa;" :
stts === "milestone" ? "#aaa;" :
stts === "unstable" ? "#f00;" :
stts === "experimental" ? "#f00;" :
stts === "beta" ? "#d80;" :
stts === "stable" ? "#0a0;" :
stts === "magic" ? "#aaa;" :
stts === "bundled since" ? "#0a0;font-weight:bold;" :
"#f00;"
) + "'>" + stts.charAt( 0 ).toUpperCase() + stts.slice( 1 ) + ": " + lurv + "</span>";
}
}
}
}
} );
);
}
}
}
}
}
}
}
function initCheckExtensionVersions() {
var btn = document.createElement( "button" );
btn.setAttribute( "style", "vertical-align: -6px;" );
btn.innerHTML = "Check Versions";
btn.addEventListener( "click", checkExtensionVersions, false );
tbls[0].setAttribute( "style", "display: inline-table;" );
tbls[0].parentElement.insertBefore( btn, tbls[0].nextSibling );
}
}
   
   
Line 73: Line 144:
  * Next ***
  * Next ***
  */
  */
 
// code code code
// code code code
 
/*****************************************************************************************/
/*****************************************************************************************/
   
   
Line 81: Line 152:
  * Call the functions above
  * Call the functions above
  */
  */
 
checkExtensionVersions();
if ( mw.config.get( "wgUserGroups" ).indexOf( "sysop" ) >= 0 ) {
initCheckExtensionVersions();
}


}()); // END WRAPPER
}()); // END WRAPPER

Latest revision as of 04:42, 22 June 2014

/*****************************************************************************************
 * JavaScript here will be loaded by MediaWiki:Common.js when viewing "Special:Version".
 *
 *****************************************************************************************/

(function() { // BEGIN WRAPPER
 
/*****************************************************************************************
 * Variables required by all functions below
 */

	// All tables on "Special:Version"
	var tbls = document.getElementsByTagName( "table" );

/*****************************************************************************************
 * Check extension versions and indicate available updates.
 * Maintainer: BIKI User:Fred Gandt
 */

	function checkExtensionVersions() {
		var mwve = tbls[0].getElementsByTagName( "tr" )[1].getElementsByTagName( "td" )[1],
			exts = tbls[2].getElementsByTagName( "em" ),
			mwaddr = "www.mediawiki.org",
			mwcurv = mwve.textContent,
			extso = {};
			fetchData = function( ns, n, fnc ) {
				$.ajax( {
					url: "https://" + mwaddr + "/w/api.php",
					data: {
						action: "query",
						prop: "revisions",
						rvprop: "content",
						titles: ns + n,
						format: "json",
						redirects: ""
					},
					dataType: "jsonp",
					success: function( data ) {
						var pgs = data.query.pages;
						for ( var pg in pgs ) {
							if ( pgs[pg].hasOwnProperty( "revisions" ) ) {
								var ttl = !!data.query.redirects ? data.query.redirects[0].from : pgs[pg].title;
								fnc( pgs[pg].revisions[0]["*"], ttl.replace( / /g, "_" ).replace( ns, "" ).toLowerCase() );
								break;
							}
						}
					}
				} );
			};
		fetchData(
			"Template:",
			"MW_stable_branch_number",
			function( txt, ttl ) {
				var mwlurv = txt.substring( 0, txt.indexOf( "<noinclude>" ) ).trim(),
					mwrnaddr = "Release_notes/" + mwlurv;
				if ( mwlurv > mwcurv ) {
					fetchData(
						"",
						mwrnaddr,
						function( txt, ttl ) {
							var mwcmpt = /={2,}\s*compatibility\s*={2,}([^]+)={2,}\s*[\w]+\s*={2,}/i.exec( txt );
							if ( !!mwcmpt ) {
								mwve.innerHTML = "Current version: " + mwcurv +
								"<br><b><span style='color:#0a0;'>Latest stable version: " + mwlurv + "</span>" +
								"<br>Compatibility <a href='https://" + mwaddr + "/wiki/" + mwrnaddr + "'>release notes for " + mwlurv + "</a>:</b>" +
								"<p style='margin-left:1em;white-space:pre-wrap;'>" + mwcmpt[1].trim() + "</p>";
							}
						}
					);
				}
			}
		);
		for ( var ext in exts ) {
			if ( typeof exts[ext] == "object" ) {
				var ev = exts[ext].getElementsByClassName( "mw-version-ext-version" );
				if ( ev[0] ) {
					var en;
					if ( exts[ext].firstChild.nodeType === Node.ELEMENT_NODE && exts[ext].firstChild.hasAttribute( "href" ) ) {
						en = exts[ext].firstChild.getAttribute( "href" );
						if ( en.indexOf( mwaddr ) > 0 ) {
							en = en.substring( en.indexOf( "Extension:" ) + 10 );
						} else {
							en = exts[ext].firstChild.textContent.trim();
						}
					} else {
						en = exts[ext].firstChild.textContent.trim();
					}
					extso[en.toLowerCase().replace( / /g, "_" )] = [
						exts[ext],
						ev[0].textContent.replace( /[^\d\. ]/g, "" ).trim()
					];
					fetchData(
						"Extension:",
						en,
						function( txt, ttl ) {
							var curv = extso[ttl][1],
								stts = /\|\s*status\s*=\s*(.+)\s*\|/i.exec( txt ),
								lurv = /\|\s*version\s*=\s*(.+)\s*\|/i.exec( txt ),
								bndl = [];
							if ( !!stts && !!lurv ) {
								stts = stts[1].toLowerCase();
								lurv = lurv[1].replace( /<.*>/g, "" ).trim();
								bndl = /\|.*(?=\bbundled\b).*(?=\bmediawiki\b).*(?=\s([\d\.]+)).*/i.exec( txt );
							} else {
								bndl = /\s*\{\{\s*archived(?: |_)extension\s*\|\s*\d+\s*\|\s*reason\s*=.*(?=\bmerged\b).*(?=\bcore\b).*(?=\bmediawiki\b).*(?=\bversion\s*([\d\.]+)).*/i.exec( txt );
							}
							if ( !!bndl ) {
								stts = "bundled since";
								lurv = bndl[1].replace(/[^\d]*$/g, "");
								curv = mwcurv;
							}
							if ( lurv != curv ) { // todo: latest version is greater than current version
								extso[ttl][0].innerHTML += "<br><span style='color:" + (
								stts === "unmaintained" ? "#aaa;" :
									stts === "archive" ? "#aaa;" :
										stts === "milestone" ? "#aaa;" :
											stts === "unstable" ? "#f00;" :
												stts === "experimental" ? "#f00;" :
													stts === "beta" ? "#d80;" :
														stts === "stable" ? "#0a0;" :
															stts === "magic" ? "#aaa;" :
																stts === "bundled since" ? "#0a0;font-weight:bold;" :
																	"#f00;"
								) + "'>" + stts.charAt( 0 ).toUpperCase() + stts.slice( 1 ) + ": " + lurv + "</span>";
							}
						}
					);
				}
			}
		}
	}
	function initCheckExtensionVersions() {
		var btn = document.createElement( "button" );
		btn.setAttribute( "style", "vertical-align: -6px;" );
		btn.innerHTML = "Check Versions";
		btn.addEventListener( "click", checkExtensionVersions, false );
		tbls[0].setAttribute( "style", "display: inline-table;" );
		tbls[0].parentElement.insertBefore( btn, tbls[0].nextSibling );
	}
 
/*****************************************************************************************/
 
/*****************************************************************************************
 * Next ***
 */

	// code code code

/*****************************************************************************************/
 
/*****************************************************************************************
 * Call the functions above
 */

	if ( mw.config.get( "wgUserGroups" ).indexOf( "sysop" ) >= 0 ) {
		initCheckExtensionVersions();
	}

}()); // END WRAPPER