function autoEdWhitespace(str) { //MAIN FUNCTION describes list of fixes
str = str.replace(/\t/g, " ");
str = str.replace(/^ ? ? \n/gm, "\n");
// Extra newlines
if(str.search(/\uE000/g) < 0) { // see ]
// Mark spacing before stub templates
str = str.replace(/(\n)*(\n)*(\n\{\{*\-stub\}\})/gm, "$1\uE000$2\uE000$3");
str = str.replace(/(\n)*(\n\{\{*\-stub\}\})/gm, "$1\uE000$2");
// Remove extra newlines
str = str.replace(/(?:*\n)+*(\n\uE000\n\uE000\n)/gm, "$1");
str = str.replace(/(\n\n)\n+/gm, "$1");
str = str.replace(/(\n*\n)(?:*\n)+/g, "$1");
// Unmark
str = str.replace(/\uE000/g, '');
}
// str = str.replace(/== ? ?\n\n==/g, "==\n==");
str = str.replace(/\n\n(\* ?\[?http)/g, "\n$1");
str = str.replace(/^ ? ? \n/gm, "\n");
str = str.replace(/\n\n\*/g, "\n*");
// str = str.replace(/+/g, " ");
str = str.replace(/(=\n*\n*\n)(?:*\n)+/g, "$1");
str = str.replace(/ \n/g, "\n");
//* bullet points
if(str.search(/\uE000/g) < 0) { // see ]
str = str.replace(/^(\#)(REDIRECT)/gi, '$1\uE000$2'); // Mark redirects
str = str.replace(/^(+:*) /gm, "$1");
str = str.replace(/^(+:*)/gm, "$1 ");
str = str.replace(/*\uE000*/g, ''); // Unmark redirects
}
//==Headings==
str = str.replace(/^(={1,4} )*(*)*( ={1,4})$/gm, "$1$2$3");
str = str.replace(/^(={1,4})(*)+(={1,4})$/gm, "$1$2$3");
str = str.replace(/^(={1,4})+(*)(={1,4})$/gm, "$1$2$3");
return str;
}