jQuery(document).ready(function($) {
if(mw.config.get('wgNamespaceNumber') != -1) {
mw.loader.using(['mediawiki.util']).done( function() {
var portletlink = mw.util.addPortletLink('p-tb','#','Collapsible option','t-clps');
$(portletlink).click(function(e) {
e.preventDefault();
collapsibleoptionfunction();
});
});
}
// -------------------------------------------------------------------------------- //
function collapsibleoptionfunction()
{
var myContent = document.getElementById('wpTextbox1').value;
// make sure there is a navbox on the page
var myHasNavboxFlag = 0;
if( myContent.search(/\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:navbox|military[_ ]+navigation|campaign)/gi) >= 0 ) {
myHasNavboxFlag = 1;
}
if( myContent.search(/\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:Country[_ ]+topics|Region[_ ]+topics|Territory[_ ]+topics|Africa[_ ]+topic|Americas[_ ]+topic|Asia[_ ]+topic|Australia[_ ]+topic|Australia[_ ]+states[_ ]+and[_ ]+territories[_ ]+topic|Central[_ ]+America[_ ]+topic|Dutch[_ ]+municipality|European[_ ]+topic|Europe[_ ]+topic|Germany[_ ]+States[_ ]+topic|Indian[_ ]+State[_ ]+topic|North[_ ]+America[_ ]+topic|Oceania[_ ]+topic|South[_ ]+America[_ ]+topic|United[_ ]+States[_ ]+topic|US[_ ]+states[_ ]+navbox[_ ]+with[_ ]+columns)/gi) >= 0 ) {
myHasNavboxFlag = 1;
}
if( myContent.search(/\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:County|Crossings[_ ]+navbox|Football[_ ]+chairperson[_ ]+history|Cycling[_ ]+team|Football[_ ]+manager[_ ]+history|National[_ ]+field[_ ]+hockey[_ ]+squad|National[_ ]+futsal[_ ]+squad|Navbox[_ ]+rugby[_ ]+league[_ ]+squad|Penthouse[_ ]+Pets|SA[_ ]+district[_ ]+navigation[_ ]+box|Season[_ ]+navbox|Shades[_ ]+of[_ ]+color|Year[_ ]+in[_ ]+football|Riksdagsledamöter)/gi) >= 0 ) {
myHasNavboxFlag = 1;
}
if( myContent.search(/\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:US[_ ]+state[_ ]+navigation[_ ]+box)/gi) >= 0 ) {
myHasNavboxFlag = 2; // use collapse_state or state
}
if( myContent.search(/\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:Mexico[_ ]+state[_ ]+navigation[_ ]+box|US[_ ]+county[_ ]+navigation[_ ]+box|CurrentCongDeleg|USCongDistState|NRHP[_ ]+navigation[_ ]+box)/gi) >= 0 ) {
myHasNavboxFlag = 3; // use collapse_state instead of state
}
if( myHasNavboxFlag > 0) {
// simplify autocollapse/expanded
myContent = myContent.replace(/(<includeonly>)(\{\{\{1)(\|autocollapse)(\}\}\})(<\/includeonly>)<noinclude>expanded<\/noinclude>/gi, '$2$1$3$5$4');
myContent = myContent.replace(/(\{\{\{1)(\|)(<includeonly>)(autocollapse<\/includeonly>)<noinclude>expanded<\/noinclude>(\}\}\})/gi, '$1$3$2$4$5');
// mark state parameters that are not in the navbox (unmarked later)
myContent = myContent.replace(/(\{\{[_ ]*(?:template[_ ]*:[_ ]*|)(?:co|collapsible[_ ]+option)[_ ]*\|[^{}]*sta)(te[ ]*=)/gi, '$1<!-- TT script mark -->$2');
// mark other problematic spots
myContent = myContent.replace(/(\|[ ]*ti)(tle[ ]*=[ ]*\{\{(?:[^{}]|\{\{\{[^{}]*\}\}\})*[\r\n])/g, '$1<!-- TT script mark -->$2');
// add state parameter if it's not there
// (1) try adding to | state = or | collapse_state =
if( myHasNavboxFlag > 1) {
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state/g) < 0 ) {
myContent = myContent.replace(/(\|[ ]*collapse_state[ ]*=)[ ]*((?:[^\|\{\}<>\n]|<\/?includeonly>|<\/?noinclude>|\{\{\{[^{}]*\}\}\})*)([\|\n]|-->[ ]*[\n])/, '$1 \{\{\{collapse_state|$2\}\}\}$3');
myContent = myContent.replace(/(\|[ ]*collapse_state[ ]*=[ ]*\{\{\{collapse_state)(\|)<includeonly>([^{}<>]*)<\/includeonly><noinclude>[^<>]*<\/noinclude>([^{}<>]*)(\}\}\})/g, '$1<includeonly>$2$3$4</includeonly>$5');
myContent = myContent.replace(/(\|[ ]*collapse_state[ ]*=[ ]*\{\{\{collapse_state)(\|[^{}<>]*)<noinclude>[^<>]*<\/noinclude>([^{}<>]*)(\}\}\})/g, '$1<includeonly>$2$3</includeonly>$4');
}
}
if( myHasNavboxFlag < 2) {
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state/g) < 0 ) {
myContent = myContent.replace(/(\|[ ]*state[ ]*=)[ ]*((?:[^\|\{\}<>\n]|<\/?includeonly>|<\/?noinclude>|\{\{\{[^{}]*\}\}\})*)([\|\n]|<!--[^\n<>]*-->[ ]*[\n])/, '$1 \{\{\{state|$2\}\}\}$3');
myContent = myContent.replace(/(\|[ ]*state[ ]*=[ ]*\{\{\{state)(\|)<includeonly>([^{}<>]*)<\/includeonly><noinclude>[^<>]*<\/noinclude>([^{}<>]*)(\}\}\})/g, '$1<includeonly>$2$3$4</includeonly>$5');
myContent = myContent.replace(/(\|[ ]*state[ ]*=[ ]*\{\{\{state)(\|[^{}<>]*)<noinclude>[^<>]*<\/noinclude>([^{}<>]*)(\}\}\})/g, '$1<includeonly>$2$3</includeonly>$4');
}
} else {
myContent = myContent.replace(/(\|[ ]*st)(ate[ ]*=)/g, '$1<!-- TT script mark -->$2');
}
// (2) loop over field names, attempting to add the | state = after each one
var farray = new Array("teamname", "title", "comp ", "comp", "country", "territory", "region", "titlename", "template_name", "name ", "name", "year ", "year", "province_code", "capital", "province", "wikiname", "State", "st<!-- TT script mark -->ate");
for( var i=0; i < farray.length; i++ ) {
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state/g) < 0 ) {
if( myContent.search(/\|[ ]*(?:collapse_|)state[ ]*=/g) < 0 ) {
var myPattern;
myPattern = new RegExp("([ ]*\\|[ ]*[\\n]?[ ]*" + farray[i] + "[ ]*=(?:[^\\n\\[\\]\\|\\{\\}]|\\[\\[[^\\[\\]]*\\]\\]|\\{\\{[^\\{\\}]*\\}\\})*)(\\|)", "g");
myContent = myContent.replace( myPattern, '$1<!-- TT newline mark -->\n$2');
myPattern = new RegExp("([ ]*\\|[ ]*[\\n]?[ ]*)(" + farray[i] + ")([ ]*=)([^\\n]*[\\n])");
if( myHasNavboxFlag > 1) {
myContent = myContent.replace( myPattern, '$1$2$3$4$1collapse_state$3 \{\{\{collapse_state|autocollapse\}\}\}|\n');
} else {
myContent = myContent.replace( myPattern, '$1$2$3$4$1state$3 \{\{\{state|autocollapse\}\}\}|\n');
}
myContent = myContent.replace(/(\|[ ]*(?:collapse_|)state[ ]*=[ ]*\{\{\{(?:collapse_|)state\|[^{}]*\}\}\})[ ]*\|[ ]*([\n](?: |[\n])*\|)/, '$1$2');
myContent = myContent.replace(/(\|)[ ]*([\n])[ ]*\|[ ]*[\n]?[ ]*((?:collapse_|)state[ ]*=[ ]*\{\{\{(?:collapse_|)state\|[^{}]*\}\}\})/, '$1$2$3');
}
}
}
myContent = myContent.replace(/[\n]*<!-- TT newline mark -->[\n]*/g, '');
myContent = myContent.replace(/<!-- TT script mark -->/g, '');
if( myHasNavboxFlag > 1) {
if( myContent.search(/\{\{\{[ ]*1/g) < 0 ) {
myContent = myContent.replace(/(=[ ]*\{\{\{collapse_state\|)([^{}\|]*)(\}\}\})/g, '$1\{\{\{1|$2\}\}\}$3');
myContent = myContent.replace(/(=[ ]*\{\{\{collapse_state\|\{\{\{1\|)autocollapse(\}\}\})/g, '$1$2');
}
}
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state/g) < 0 ) {
alert("Unable to determine where to add the state parameter!");
return;
}
} else {
alert("Found no navbox on this page!");
return;
}
// add collapsible option if it's not there and the state parameter is there
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state/g) >= 0 ) {
// mark redundant noinclude sections (unmark later)
while( myContent.match(/<noinclude>/gi).length > 1 ) {
myContent = myContent.replace(/(<no)(include>)/i, '$1<!-- TT script mark -->$2');
}
// mark places to avoid adding collapsible option (unmark later)
myContent = myContent.replace(/(<no)(include>[^<>\[\]\n]*<\/no)(include>)/gi, '$1<!-- TT script mark -->$2<!-- TT script mark -->$3');
if( myContent.search(/(?:<\/?noinclude>|<\/?onlyinclude>)/gi) < 0 ) {
myContent = myContent + '<noinclude></noinclude>';
myContent = myContent.replace(/((?:[\t ]|[\n])*)(<noinclude>)/gim, '$2$1');
myContent = myContent.replace(/<\/no(?:<!-- TT script mark -->|)include><noinclude>/gim, '');
}
if( myContent.search(/\{\{[_ ]*(?:[Cc]ollapsible[_ ]+option|[Cc][Oo][Pp])[_ ]*(?:\||\}\})/g) < 0 ) {
if( myContent.search(/\{\{[_ ]*(?:template:[_ ]*|)(?:documentation|doc|docs|documentation,[_ ]+template|template[_ ]+doc|template[_ ]+documentation)[_ ]*[\n]?\|[ ]*content[ ]*=/gi) >= 0) {
myContent = myContent.replace(/(\{\{[_ ]*(?:template:[_ ]*|)(?:documentation|doc|docs|documentation,[_ ]+template|template[_ ]+doc|template[_ ]+documentation)[_ ]*[\n]?\|[ ]*content[ ]*=[ ]*[\n]?)/i, '$1<!-- TT script add CO here -->');
myContent = myContent.replace(/(<!-- TT script add CO here -->)((?:[\n]|.)*==[ ]*Usage[ ]*===*[ ]*[\n])/gim, '$2$1');
myContent = myContent.replace(/([\n])(\[\[Category:)/gi, '$1<!-- {TT script mark} -->$2');
myContent = myContent.replace(/<!-- {TT script mark} -->(\[\[Category:)/i, '$1');
myContent = myContent.replace(/([\n])(==)/gi, '$1<!-- {TT script mark} -->$2');
myContent = myContent.replace(/(<!-- TT script add CO here -->)((?:[\n]|\{\{[^{}]*\}\}|[^{}])*)([\n]\[\[Category:)/gim, '$2$1$3');
myContent = myContent.replace(/<!-- TT script add CO here -->/gi, '\n{{collapsible option}}\n');
myContent = myContent.replace(/<!-- {TT script mark} -->/gi, '');
}
}
if( myContent.search(/\{\{[_ ]*(?:[Cc]ollapsible[_ ]+option|[Cc][Oo][Pp])[_ ]*(?:\||\}\})/g) < 0 ) {
myContent = myContent.replace(/(<[ ]*noinclude[ ]*>)[ ]*\n/i, '$1\n{{collapsible option}}\n');
}
if( myContent.search(/\{\{[_ ]*(?:[Cc]ollapsible[_ ]+option|[Cc][Oo][Pp])[_ ]*(?:\||\}\})/g) < 0 ) {
myContent = myContent.replace(/(<[ ]*noinclude[ ]*>)[ ]*/i, '$1\n{{collapsible option}}\n');
}
if( myContent.search(/\{\{\{[ ]*(?:collapse_|)state[ ]*\|[ ]*\{\{\{[ ]*1/g) >= 0 ) {
myContent = myContent.replace(/(\{\{collapsible option)(\}\})/i, '$1|statename=optional$2');
}
myContent = myContent.replace(/<!-- TT script mark -->/g, '');
}
// too much whitespace
myContent = myContent.replace(/(\{\{\{[ ]*(?:collapse_|)state\|)[ ]+([^{}]*)[ ]*(\}\}\})/g, '$1$2$3');
myContent = myContent.replace(/(\{\{\{[ ]*(?:collapse_|)state\|)[ ]*([^{}]*[^{} ])[ ]+(\}\}\})/g, '$1$2$3');
// includeonly with collapsed
if(myContent.search(/<includeonly>/gi) < 0 ) {
myContent = myContent.replace(/(\|[ ]*state[ ]*=[ ]*\{\{\{(?:collapse_|)state)\|collapsed(\}\}\})/, '$1<includeonly>|collapsed</includeonly>$2');
}
myContent = myContent.replace(/(\|[ ]*state[ ]*=[ ]*\{\{\{(?:collapse_|)state)\|<[ ]*includeonly[ ]*>[ ]*collapsed[ ]*<[ ]*\/[ ]*includeonly[ ]*>(\}\}\})/i, '$1<includeonly>|collapsed</includeonly>$2');
myContent = myContent.replace(/(\{\{\{(?:collapse_|)state)\|<noinclude>uncollapsed<\/noinclude><includeonly>collapsed<\/includeonly>(\}\}\})/gi, '$1<includeonly>|collapsed</includeonly>$2');
// includeonly only half inside state
myContent = myContent.replace(/(\{\{\{(?:collapse_|)state[ ]*\|[^\{\}<>]*)(<\/includeonly>)([^\{\}<>]*\}\}\})/, '$1$3$2');
myContent = myContent.replace(/(\{\{\{(?:collapse_|)state[ ]*\|[^\{\}<>]*)(<includeonly>)([^\{\}<>]*\}\}\})/, '$2$1$3');
// nested includeonly tags
myContent = myContent.replace(/(<includeonly>(?:[^<>]|[\n])*)<includeonly>((?:[^<>]|[\n])*)<\/includeonly>/gim, '$1$2');
if( myContent.search(/\{\{[_ ]*(?:template:[_ ]*|)(?:documentation|doc|docs|documentation,[_ ]+template|template[_ ]+doc|template[_ ]+documentation)[_ ]*\}\}/gi) >= 0 ) {
myContent = myContent.replace(/\{\{[_ ]*(?:Template[_ ]*:[_ ]*|)collapsible[_ ]+option[_ ]*(?:\|[ ]*statename[ ]*=[ ]*optional[ ]*|)\}\}[ ]*[\n]?/, '');
alert("Found {{documentation}} on this page, you should add the {{collapsible option}} to the /doc page!");
}
if(document.getElementById('wpTextbox1').value != myContent) {
document.getElementById('wpTextbox1').value = myContent;
if( myContent.search(/\{\{\{[ ]*state(?: |<includeonly>)*\|/g) >= 0 ) {
document.getElementById('wpSummary').value = 'adding \{\{collapsible option\}\} and/or \{\{\{state\}\}\}';
} else {
document.getElementById('wpSummary').value = 'adding \{\{collapsible option\}\} and/or \{\{\{collapse_state\}\}\}';
}
}
}
// -------------------------------------------------------------------------------- //
});