User:Omegatron/monobook.js/headingformattingfixer.js

function headingfixer() {

var txt = document.editform.wpTextbox1;

// Format heading markup the way it is generated with the + tab

// Note: the ? after the * is not redundant, see http://www.regular-expressions.info/repeat.html#lazy

txt.value = txt.value.replace(/((^|\n)={2,})( |\t)*(.*?)( |\t)*(={2,})/g, '$1 $4 $6\n\n');

// 1 blank line before the headings

// (this is super-kludgy because of the newlines conflicting when one heading is right after another)

// (seems to work, though, for now. some other day...)

txt.value = txt.value.replace(/(\n+={2,}) (.*?) (={2,})/g, '\n\n$1 $2 $3');

// Remove all extra newlines?

txt.value = txt.value.replace(/(\n[ \t\v\r\f]*){2,}/g, '\n\n');

// One space after * and # lists, and after : and ;

txt.value = txt.value.replace(/(^|\n)((\*|\#|\;|\:)+)\s*(\w|\[|\"|\'|\{\{)/g, '$1$2 $4');

// Format External links and See also according to the Manual of Style

txt.value = txt.value.replace(/\=\= external links? \=\=/ig, '== External links ==');

txt.value = txt.value.replace(/\=\= see also \=\=/ig, '== See also ==');

// Add a tag to the summary box

var txt = document.editform.wpSummary;

var summary = "Regex heading and whitespace fixer";

if (txt.value.indexOf(summary) == -1) {

if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {

txt.value += " | ";

}

txt.value += summary;

}

// Press the diff button to check it

if( typeof( autoDiffClick ) == 'undefined' || autoDiffClick === true ) {

document.editform.wpDiff.click();

}

}

$(function () {

if(document.forms.editform) {

mw.util.addPortletLink('p-cactions', 'javascript:headingfixer()', '_', 'ca-headingfixer', 'Fixes heading whitespace and deletes excess newlines', '-', '');

}

});