From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

//<pre>

// Checks whether the Manual of Style is satisfied for article titles and section headings

//

// To use this script, add "importScript('User:Proteins/mosheadcheck.js');" to your monobook.js subpage 

// under your user page, as you can see at User:Proteins/monobook.js



// Black list of words that probably shouldn't appear at the start of a section heading

var forbidden_first_words_in_section_headings = 

"a", "an", "the", "in", "on", "concerning", "about", "through", "against", "for", "with", "without", "around", "from", "out", "because", "since", "while", "during", "throughout", "my", "your", "his", "her", "its", "our", "their", "I", "me", "you", "he", "him", "she", "it", "we", "us", "they", "them"

];



//****************************************************

// Check that the section headings conform to MOS:HEAD

//****************************************************

function checkSectionHeadings() {

	var alert_string = "";



	var num_errors = 0;

	var error_index = 0;

	var error_string = "";

	var max_num_errors_per_alert = 10;

	var error_string_list = new Array();



	var body_content;

	var article_title_node;

	var article_title = "";



	var anchors;

	var temp_anchor;

	var num_anchors = 0;

	var anchor_index = 0;

	var num_H2_anchors = 0;



	var anchor_string_index = 0;

	var proper_anchor_level = 0;

	var proper_anchor_string = "";



	var parent_node;

	var sibling_node;

	var next_sibling_node;



	var child_nodes;

	var num_child_nodes;



	var span_nodes;

	var temp_span_node;

	var num_span_nodes = 0;

	var span_node_index = 0;



	var anchor_level = 0;

	var prev_anchor_level = 0;



	var section_name = "";

	var temp_anchor_name = "";

	var num_section_names = 0;

	var section_name_index = 0;

	var apparent_section_name = "";

	var section_name_list = new Array();



	var words;

	var temp_word;

	var first_word;

	var num_words = 0;

	var word_index = 0;



	var forbidden_word;

	var num_forbidden_words = forbidden_first_words_in_section_headings.length;



	var num_See_also_sections = 0;

	var num_Notes_sections = 0;

	var num_References_sections = 0;

	var num_Bibliography_sections = 0;

	var num_Further_reading_sections = 0;

	var num_External_links_sections = 0;





// Get the bodyContent node

	body_content = document.getElementById('bodyContent');

	if (!body_content) { 

		error_string = "ERROR: There is no bodyContent node in this article.";

		window.alert(error_string);

		return;

	}



// Determine the article title and check for MoS violations

	num_errors = 0;

	error_string = "";



	article_title_node = body_content.previousSibling;

	while ((article_title_node) && (article_title_node.nodeType != 1)) { 

		article_title_node = article_title_node.previousSibling;

	}

	if (article_title_node) { 

		if ((article_title_node.nodeName == "H1") && (article_title_node.className.match(/firstHeading/))) { 

			article_title = article_title_node.innerHTML;

			article_title = article_title.replace(/<span[^>]*>.*<\/span>/, "");



			if (!article_title.match(/^[A-Z0-9]/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" does not begin with a capital letter or a digit.\n";

				error_string += "\tPlease capitalize the first word of the title, but no other words.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}



			// Check for punctuation generally

			if (article_title.match(/[^A-Za-z0-9–,:'\(\)\s\-]/g)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has punctuation or non-English characters.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}

			if ((article_title.match(/\s\-/g)) || (article_title.match(/\-\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has a spaced hyphen.\n";

				error_string += "\tPlease use hyphens only for compound nouns and adjectives in article titles.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}

			if ((article_title.match(/\s–/g)) || (article_title.match(/–\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has a spaced en-dash.\n";

				error_string += "\tPlease use en-dashes only for compound nouns and adjectives in article titles.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}



			words = article_title.split(' ');

			if (words) { 

				num_words = words.length;

				if (num_words > 0) { 

					if (num_words > 9) { 

						num_errors++; 

						error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has more than nine words (" + num_words + " words).\n";

						error_string_list.push(error_string);

						article_title_node.style.cssText = "background-color:red";

					}



					for (word_index=0; word_index<num_words; word_index++) {

						if ((word_index > 0) && (wordsword_index].match(/^[A-Z]/)) && (!wordsword_index-1].match(/:$/))) { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in article title \"" + article_title + "\" is capitalized.\n";

							error_string += "\tPlease capitalize only the first word of an article title, unless a proper name.\n";

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";	

						}

						temp_word = wordsword_index].substr(1);

						if (!temp_word) { continue; }

						if (temp_word.match(/[A-Z]/))  { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in article title \"" + article_title + "\" has internal capital letters.\n";

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";							

						}

					} // closes loop checking the individual words



					first_word = words0].toLowerCase();

					for (word_index=0; word_index<num_forbidden_words; word_index++) {

						forbidden_word = forbidden_first_words_in_section_headingsword_index];

						if (first_word == forbidden_word) {

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" begins with a forbidden word \"" + forbidden_word + "\".\n";

							switch (forbidden_word) {

 								case "a":

								case "an":

									error_string += "\tPlease do not start an article title with an indefinite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "the":

									error_string += "\tPlease do not start an article title with an definite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "in":

								case "on":

								case "for":

								case "out":

								case "with":

								case "from":

								case "about":

								case "around":

								case "through":

								case "without":

								case "against":

									error_string += "\tPlease do not start an article title with a preposition such as \"" + forbidden_word + "\".\n";

							 		break;



								case "concerning":

									error_string += "\tPlease do not start an article title with a verb participle such as \"" + forbidden_word + "\".\n";

							 		break;

								case "since":

								case "while":

								case "during":

								case "because":

								case "throughout":

									error_string += "\tPlease do not start an article title with a conjunction such as \"" + forbidden_word + "\".\n";

							 		break;

								case "my":

								case "your":

								case "yours":

								case "his":

								case "her":

								case "hers":

								case "its":

								case "our":

								case "their":

								case "I":

								case "me":

								case "you":

								case "he":

								case "him":

								case "she":

								case "it":

								case "we":

								case "us":

								case "they":

								case "them":

									error_string += "\tPlease do not start an article title with a pronoun such as \"" + forbidden_word + "\".\n";

							 		break;

							} // closes switch on the forbidden word

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";

							break; // break out of loop over forbidden words

						}

					}

				} // closes check for positive number of words in article title

			} // closes check  that words exist in the article title

		} // closes check for proper article title

	} // closes check for article title node

	section_name_list.push(article_title);



// Get the document anchors

	anchors = document.anchors;

	if (!anchors) { 

		window.alert("This document has no anchors.\n\n");

		return;

	}

	num_anchors = anchors.length;

	if (num_anchors<1) { 

		window.alert("This document has zero anchors.\n\n");

		return;

	}



// Loop over the anchors

	num_See_also_sections = 0;

	num_Notes_sections = 0;

	num_References_sections = 0;

	num_Bibliography_sections = 0;

	num_Further_reading_sections = 0;

	num_External_links_sections = 0;



	num_H2_anchors = 0;

	num_section_headings = 0;

	section_name = "lead section";

	prev_anchor_level = 1;  //begin at the H1 heading



	for (anchor_index=1; anchor_index<num_anchors; anchor_index++) {

		temp_anchor = anchorsanchor_index];

		if (!temp_anchor) { continue; }



		parent_node = temp_anchor.parentNode; 

		if (!parent_node) { continue; }

 

		sibling_node = parent_node.nextSibling;

		if (!sibling_node) { continue; }



		temp_anchor_name = temp_anchor.name;



// Check headings for jumps upwards in heading level

		anchor_level = 0;

		if (sibling_node.nodeName == "H1") {

			num_errors++;

			if (num_H2_anchors == 0) { 

				error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in the lead section\n";

			} else { 

				error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

			}

			error_string_list.push(error_string);

			sibling_node.style.cssText = "background-color:red";

		} else if (sibling_node.nodeName == "H2") {

			anchor_level = 2;	

		} else if (sibling_node.nodeName == "H3") {

			anchor_level = 3;	

		} else if (sibling_node.nodeName == "H4") {

			anchor_level = 4;	

		} else if (sibling_node.nodeName == "H5") {

			anchor_level = 5;	

		}  else { 

			next_sibling_node = sibling_node.nextSibling;

			if (!next_sibling_node) { continue; }



// Check headings for jumps upwards in heading level

			if (next_sibling_node.nodeName == "H1") {

				num_errors++;

				if (num_H2_anchors == 0) { 

					error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in the lead section\n";

				} else { 

					error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

				}

				error_string_list.push(error_string);

				next_sibling_node.style.cssText = "background-color:red";

			} else if (next_sibling_node.nodeName == "H2") {

				anchor_level = 2;	

			} else if (next_sibling_node.nodeName == "H3") {

				anchor_level = 3;	

			} else if (next_sibling_node.nodeName == "H4") {

				anchor_level = 4;	

			} else if (next_sibling_node.nodeName == "H5") {

				anchor_level = 5;	

			}

			sibling_node = next_sibling_node;

		} // closes assignment of the anchor level, if any 

 

		if (((anchor_level - prev_anchor_level) > 1) && (prev_anchor_level != 0)) {

			proper_anchor_level = prev_anchor_level - 0 + 1;

			proper_anchor_string = "";

			for (anchor_string_index=0; anchor_string_index<proper_anchor_level; anchor_string_index++) { 

				proper_anchor_string += "=";

			}



			if (num_H2_anchors == 0) {

				num_errors++;

				error_string = "ERROR " + num_errors + ": H" + prev_anchor_level + " to H" + anchor_level + " jump in the lead section\n";

				error_string += "\tThe correct subheading would be H" + proper_anchor_level + ", which is \"" + proper_anchor_string + temp_anchor_name.replace(/(_+)/ig, " ") + proper_anchor_string + "\" in wiki-markup.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			} else {

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + prev_anchor_level + " to H" + anchor_level + " jump in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

				error_string += "\tThe correct subheading would be H" + proper_anchor_level + ", which is \"" + proper_anchor_string + temp_anchor_name.replace(/(_+)/ig, " ") + proper_anchor_string + "\" in wiki-markup.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

		}





// Check section names

		if (anchor_level > 0) { 

			section_name = temp_anchor.name;

			prev_anchor_level = anchor_level;



			// Compare the heading section name with the anchor section name

			apparent_section_name = section_name;

			span_nodes = sibling_node.getElementsByTagName("SPAN");

			if (span_nodes) { 

				num_span_nodes = span_nodes.length;

				if (num_span_nodes > 0) { 

					for (span_node_index=0; span_node_index<num_span_nodes; span_node_index++) { 

						temp_span_node = span_nodesspan_node_index];

						if (!temp_span_node) { continue; } 



						if (temp_span_node.className == "mw-headline") { 

							apparent_section_name = temp_span_node.innerHTML;

							apparent_section_name = apparent_section_name.replace(/<[^>]+>/ig, "");



							// Check for links in section name

							child_nodes = temp_span_node.getElementsByTagName("A");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has a forbidden hyperlink.\n";

									error_string += "\tSection headings should never have hyperlinks.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node



							// Check for boldface type in section name

							child_nodes = temp_span_node.getElementsByTagName("B");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has boldface formatting.\n";

									error_string += "\tIt is never appropriate to use boldface type in a section heading; see MOS:BOLD.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node



							// Check for italics in section name

							child_nodes = temp_span_node.getElementsByTagName("I");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has italics formatting.\n";

									error_string += "\tPlease use italics only for titles of longer works and similar uses; see MOS:ITALICS.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node

						}

					} // closes loop over span nodes

				}

			}

			if (apparent_section_name != section_name.replace(/(_+)/ig, " ")) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" does not agree with its apparent section heading \"" + apparent_section_name + "\".\n";

				error_string += "\tThis may indicate a bad character or a repeated section heading.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for repeats with earlier section headings including article title (section 0)

			for (section_name_index=0; section_name_index<=num_section_names; section_name_index++) { 

				if (section_name.indexOf(section_name_listsection_name_index]) == 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" repeats an earlier section heading \"" + section_name_listsection_name_index + "\" (index " + section_name_index + ").\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} // closes loop over prior section names

			num_section_names++;

			section_name_list.push(apparent_section_name);



			// Check for final colons and other punctuation

			if (section_name.match(/:$/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" should not end in a colon.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for punctuation generally

			if (apparent_section_name.match(/[^A-Za-z0-9,':–\(\)\s\-]/g)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has punctuation or non-English characters.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

			if ((apparent_section_name.match(/\s\-/g)) || (apparent_section_name.match(/\-\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has a spaced hyphen.\n";

				error_string += "\tPlease use hyphens only for compound nouns and adjectives in section headings.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

			if ((apparent_section_name.match(/\s–/g)) || (apparent_section_name.match(/–\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has a spaced en-dash.\n";

				error_string += "\tPlease use en-dashes only for compound nouns and adjectives in section headings.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for initial capital letter

			if (!section_name.match(/^[A-Z0-9]/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" does not begin with a capital letter or a digit.\n";

				error_string += "\tPlease capitalize the first word of the heading, but no other words.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			words = apparent_section_name.split(' ');

			if (words) { 

				num_words = words.length;

				if (num_words > 0) { 

					if (num_words > 9) { 

						num_errors++; 

						error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has more than nine words (" + num_words + " words).\n";

						error_string_list.push(error_string);

						sibling_node.style.cssText = "background-color:red";

					}



					for (word_index=0; word_index<num_words; word_index++) {

						if ((word_index > 0) && (wordsword_index].match(/^[A-Z]/)) && (!wordsword_index-1].match(/:$/))) { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" is capitalized.\n";

							error_string += "\tPlease capitalize only the first word of a section heading, unless a proper name.\n";

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";	

						}

						temp_word = wordsword_index].substr(1);

						if (!temp_word) { continue; }

						if (temp_word.match(/[A-Z]/))  { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has internal capital letters.\n";

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";							

						}

					} // closes loop checking the individual words



					first_word = words0].toLowerCase();

					for (word_index=0; word_index<num_forbidden_words; word_index++) {

						forbidden_word = forbidden_first_words_in_section_headingsword_index];

						if (first_word == forbidden_word) {

							num_errors++; 

							error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" begins with a forbidden word \"" + forbidden_word + "\".\n";

							switch (forbidden_word) {

 								case "a":

								case "an":

									error_string += "\tPlease do not start a section heading with an indefinite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "the":

									error_string += "\tPlease do not start a section heading with an definite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "in":

								case "on":

								case "for":

								case "out":

								case "with":

								case "from":

								case "about":

								case "around":

								case "through":

								case "without":

								case "against":

									error_string += "\tPlease do not start a section heading with a preposition such as \"" + forbidden_word + "\".\n";

							 		break;



								case "concerning":

									error_string += "\tPlease do not start a section heading with a verb participle such as \"" + forbidden_word + "\".\n";

							 		break;

								case "since":

								case "while":

								case "during":

								case "because":

								case "throughout":

									error_string += "\tPlease do not start a section heading with a conjunction such as \"" + forbidden_word + "\".\n";

							 		break;

								case "my":

								case "your":

								case "yours":

								case "his":

								case "her":

								case "hers":

								case "its":

								case "our":

								case "their":

								case "I":

								case "me":

								case "you":

								case "he":

								case "him":

								case "she":

								case "it":

								case "we":

								case "us":

								case "they":

								case "them":

									error_string += "\tPlease do not start a section heading with a pronoun such as \"" + forbidden_word + "\".\n";

							 		break;

							} // closes switch on the forbidden word

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";

							break; // break out of loop over forbidden words

						}

					}

				} // closes check on num_words in section heading

			} // closes check on num_words in section heading

		} // closes check for section anchor 





//Check major section headings for closing sections

		if (anchor_level == 2) { 

			num_H2_anchors++;



			if (section_name.match(/See_also/ig)) { 

				num_See_also_sections++;

				if (num_See_also_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_See_also_sections + " \"See also\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^See_also$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"See also\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Notes_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Notes\" (or \"Footnotes\") section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"References\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if ((section_name.match(/Note/ig)) || (section_name.match(/Footnote/ig))) { 

				num_Notes_sections++;

				if (num_Notes_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Notes_sections + " \"Notes\" (\"Footnotes\") sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^Note$/i)) && (!section_name.match(/^Notes$/i)) && (!section_name.match(/^Footnote$/i)) && (!section_name.match(/^Footnotes$/i)) && (!section_name.match(/^Notes_and_references$/i)) && (!section_name.match(/^Footnotes_and_references$/i)) && (!section_name.match(/^References_and_notes$/i)) && (!section_name.match(/^References_and_footnotes$/i))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"Note\", \"Notes\", \"Footnote\", \"Footnotes\", \"Notes and references\" , \"Footnotes and references\", \"References and notes\" or \"References and footnotes\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"References\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Reference/ig)) { 

				num_References_sections++;

				if (num_References_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_References_sections + " \"References\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^Reference$/ig)) && (!section_name.match(/^References$/ig))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"Reference\" or \"References\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Bibliography/ig)) { 

				num_Bibliography_sections++;

				if (num_Bibliography_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Bibliography_sections + " \"Bibliography\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^Bibliography$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"Bibliography\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Further_reading/ig)) { 

				num_Further_reading_sections++;

				if (num_Further_reading_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Further_reading_sections + " \"Further reading\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^Further_reading$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"Further reading\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/External_link/ig)) { 

				num_External_links_sections++;

				if (num_External_links_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_External_link_sections + " \"External_links\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^External_link$/ig)) && (!section_name.match(/^External_links$/ig))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"External_link\" or \"External_links\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else { 

				if (num_See_also_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"See also\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string); 

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"References\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"Bibliography\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"Further reading\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after an \"External links\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} // closes check for the closing sections

		} // closes check for H2 anchor

	} // closes loop over the anchors



// List the section headings for debugging

	alert_string = "This article has " + num_section_names + " section headings.\n\n";

	alert_string += "\tArticle title: " + article_title + "\n\nSections:\n";

	for (section_name_index=1; section_name_index<=num_section_names; section_name_index++) { 

		alert_string += "\t" + section_name_index + ". " + section_name_listsection_name_index + "\n";

	}

	window.alert(alert_string);



// Print summary of section-heading errors

	if (num_errors < 1) {

		error_string = "No errors in heading levels and order of sections.\n";

		window.alert(error_string); 

		return;

	} else if (num_errors == 1) { 

		initial_error_string = "There is one potential MoS error in the section headings";

	} else { 

		initial_error_string = "There are " + num_errors + " potential MoS errors in the section headings";

	}

	error_string = initial_error_string + ":\n\n";

	for (error_index=0; error_index<num_errors; error_index++) { 

		if ((error_index%max_num_errors_per_alert == 0) && (error_index > 1)) { 

			error_string += "\n\t\t\t\tContinued on next screen...\n";

			window.alert(error_string); 

			error_string = initial_error_string + " (continued from previous screen):\n\n";

		}

		error_string += error_string_listerror_index];

	} // closes loop over errors

	error_string += "\nYou should also check that:\n";

	error_string += "\t1. The section headings are nouns or noun phrases.\n";

	error_string += "\t2. The section headings do not refer to the article title or other section headings.\n";

	window.alert(error_string);



} // closes function checkSectionHeadings()





//******************

// The Main Function

//******************



function checkManualOfStyle() { 



	checkSectionHeadings(); // MOS:HEAD



} // closes function checkManualOfStyle()





addOnloadHook(function () {

mw.util.addPortletLink('p-navigation', 'javascript:checkManualOfStyle()', 'Check MOS:HEAD', 'ca-moscheck', 'Checks for violations of the Manual of Style on section headings', '', '');

});

 

//</pre>
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

//<pre>

// Checks whether the Manual of Style is satisfied for article titles and section headings

//

// To use this script, add "importScript('User:Proteins/mosheadcheck.js');" to your monobook.js subpage 

// under your user page, as you can see at User:Proteins/monobook.js



// Black list of words that probably shouldn't appear at the start of a section heading

var forbidden_first_words_in_section_headings = 

"a", "an", "the", "in", "on", "concerning", "about", "through", "against", "for", "with", "without", "around", "from", "out", "because", "since", "while", "during", "throughout", "my", "your", "his", "her", "its", "our", "their", "I", "me", "you", "he", "him", "she", "it", "we", "us", "they", "them"

];



//****************************************************

// Check that the section headings conform to MOS:HEAD

//****************************************************

function checkSectionHeadings() {

	var alert_string = "";



	var num_errors = 0;

	var error_index = 0;

	var error_string = "";

	var max_num_errors_per_alert = 10;

	var error_string_list = new Array();



	var body_content;

	var article_title_node;

	var article_title = "";



	var anchors;

	var temp_anchor;

	var num_anchors = 0;

	var anchor_index = 0;

	var num_H2_anchors = 0;



	var anchor_string_index = 0;

	var proper_anchor_level = 0;

	var proper_anchor_string = "";



	var parent_node;

	var sibling_node;

	var next_sibling_node;



	var child_nodes;

	var num_child_nodes;



	var span_nodes;

	var temp_span_node;

	var num_span_nodes = 0;

	var span_node_index = 0;



	var anchor_level = 0;

	var prev_anchor_level = 0;



	var section_name = "";

	var temp_anchor_name = "";

	var num_section_names = 0;

	var section_name_index = 0;

	var apparent_section_name = "";

	var section_name_list = new Array();



	var words;

	var temp_word;

	var first_word;

	var num_words = 0;

	var word_index = 0;



	var forbidden_word;

	var num_forbidden_words = forbidden_first_words_in_section_headings.length;



	var num_See_also_sections = 0;

	var num_Notes_sections = 0;

	var num_References_sections = 0;

	var num_Bibliography_sections = 0;

	var num_Further_reading_sections = 0;

	var num_External_links_sections = 0;





// Get the bodyContent node

	body_content = document.getElementById('bodyContent');

	if (!body_content) { 

		error_string = "ERROR: There is no bodyContent node in this article.";

		window.alert(error_string);

		return;

	}



// Determine the article title and check for MoS violations

	num_errors = 0;

	error_string = "";



	article_title_node = body_content.previousSibling;

	while ((article_title_node) && (article_title_node.nodeType != 1)) { 

		article_title_node = article_title_node.previousSibling;

	}

	if (article_title_node) { 

		if ((article_title_node.nodeName == "H1") && (article_title_node.className.match(/firstHeading/))) { 

			article_title = article_title_node.innerHTML;

			article_title = article_title.replace(/<span[^>]*>.*<\/span>/, "");



			if (!article_title.match(/^[A-Z0-9]/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" does not begin with a capital letter or a digit.\n";

				error_string += "\tPlease capitalize the first word of the title, but no other words.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}



			// Check for punctuation generally

			if (article_title.match(/[^A-Za-z0-9–,:'\(\)\s\-]/g)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has punctuation or non-English characters.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}

			if ((article_title.match(/\s\-/g)) || (article_title.match(/\-\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has a spaced hyphen.\n";

				error_string += "\tPlease use hyphens only for compound nouns and adjectives in article titles.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}

			if ((article_title.match(/\s–/g)) || (article_title.match(/–\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has a spaced en-dash.\n";

				error_string += "\tPlease use en-dashes only for compound nouns and adjectives in article titles.\n";

				error_string_list.push(error_string);

				article_title_node.style.cssText = "background-color:red";

			}



			words = article_title.split(' ');

			if (words) { 

				num_words = words.length;

				if (num_words > 0) { 

					if (num_words > 9) { 

						num_errors++; 

						error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" has more than nine words (" + num_words + " words).\n";

						error_string_list.push(error_string);

						article_title_node.style.cssText = "background-color:red";

					}



					for (word_index=0; word_index<num_words; word_index++) {

						if ((word_index > 0) && (wordsword_index].match(/^[A-Z]/)) && (!wordsword_index-1].match(/:$/))) { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in article title \"" + article_title + "\" is capitalized.\n";

							error_string += "\tPlease capitalize only the first word of an article title, unless a proper name.\n";

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";	

						}

						temp_word = wordsword_index].substr(1);

						if (!temp_word) { continue; }

						if (temp_word.match(/[A-Z]/))  { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in article title \"" + article_title + "\" has internal capital letters.\n";

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";							

						}

					} // closes loop checking the individual words



					first_word = words0].toLowerCase();

					for (word_index=0; word_index<num_forbidden_words; word_index++) {

						forbidden_word = forbidden_first_words_in_section_headingsword_index];

						if (first_word == forbidden_word) {

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Article title \"" + article_title + "\" begins with a forbidden word \"" + forbidden_word + "\".\n";

							switch (forbidden_word) {

 								case "a":

								case "an":

									error_string += "\tPlease do not start an article title with an indefinite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "the":

									error_string += "\tPlease do not start an article title with an definite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "in":

								case "on":

								case "for":

								case "out":

								case "with":

								case "from":

								case "about":

								case "around":

								case "through":

								case "without":

								case "against":

									error_string += "\tPlease do not start an article title with a preposition such as \"" + forbidden_word + "\".\n";

							 		break;



								case "concerning":

									error_string += "\tPlease do not start an article title with a verb participle such as \"" + forbidden_word + "\".\n";

							 		break;

								case "since":

								case "while":

								case "during":

								case "because":

								case "throughout":

									error_string += "\tPlease do not start an article title with a conjunction such as \"" + forbidden_word + "\".\n";

							 		break;

								case "my":

								case "your":

								case "yours":

								case "his":

								case "her":

								case "hers":

								case "its":

								case "our":

								case "their":

								case "I":

								case "me":

								case "you":

								case "he":

								case "him":

								case "she":

								case "it":

								case "we":

								case "us":

								case "they":

								case "them":

									error_string += "\tPlease do not start an article title with a pronoun such as \"" + forbidden_word + "\".\n";

							 		break;

							} // closes switch on the forbidden word

							error_string_list.push(error_string);

							article_title_node.style.cssText = "background-color:red";

							break; // break out of loop over forbidden words

						}

					}

				} // closes check for positive number of words in article title

			} // closes check  that words exist in the article title

		} // closes check for proper article title

	} // closes check for article title node

	section_name_list.push(article_title);



// Get the document anchors

	anchors = document.anchors;

	if (!anchors) { 

		window.alert("This document has no anchors.\n\n");

		return;

	}

	num_anchors = anchors.length;

	if (num_anchors<1) { 

		window.alert("This document has zero anchors.\n\n");

		return;

	}



// Loop over the anchors

	num_See_also_sections = 0;

	num_Notes_sections = 0;

	num_References_sections = 0;

	num_Bibliography_sections = 0;

	num_Further_reading_sections = 0;

	num_External_links_sections = 0;



	num_H2_anchors = 0;

	num_section_headings = 0;

	section_name = "lead section";

	prev_anchor_level = 1;  //begin at the H1 heading



	for (anchor_index=1; anchor_index<num_anchors; anchor_index++) {

		temp_anchor = anchorsanchor_index];

		if (!temp_anchor) { continue; }



		parent_node = temp_anchor.parentNode; 

		if (!parent_node) { continue; }

 

		sibling_node = parent_node.nextSibling;

		if (!sibling_node) { continue; }



		temp_anchor_name = temp_anchor.name;



// Check headings for jumps upwards in heading level

		anchor_level = 0;

		if (sibling_node.nodeName == "H1") {

			num_errors++;

			if (num_H2_anchors == 0) { 

				error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in the lead section\n";

			} else { 

				error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

			}

			error_string_list.push(error_string);

			sibling_node.style.cssText = "background-color:red";

		} else if (sibling_node.nodeName == "H2") {

			anchor_level = 2;	

		} else if (sibling_node.nodeName == "H3") {

			anchor_level = 3;	

		} else if (sibling_node.nodeName == "H4") {

			anchor_level = 4;	

		} else if (sibling_node.nodeName == "H5") {

			anchor_level = 5;	

		}  else { 

			next_sibling_node = sibling_node.nextSibling;

			if (!next_sibling_node) { continue; }



// Check headings for jumps upwards in heading level

			if (next_sibling_node.nodeName == "H1") {

				num_errors++;

				if (num_H2_anchors == 0) { 

					error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in the lead section\n";

				} else { 

					error_string = "ERROR " + num_errors + ": Illegal H1 heading \"" + temp_anchor_name.replace(/(_+)/ig, " ") + "\" in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

				}

				error_string_list.push(error_string);

				next_sibling_node.style.cssText = "background-color:red";

			} else if (next_sibling_node.nodeName == "H2") {

				anchor_level = 2;	

			} else if (next_sibling_node.nodeName == "H3") {

				anchor_level = 3;	

			} else if (next_sibling_node.nodeName == "H4") {

				anchor_level = 4;	

			} else if (next_sibling_node.nodeName == "H5") {

				anchor_level = 5;	

			}

			sibling_node = next_sibling_node;

		} // closes assignment of the anchor level, if any 

 

		if (((anchor_level - prev_anchor_level) > 1) && (prev_anchor_level != 0)) {

			proper_anchor_level = prev_anchor_level - 0 + 1;

			proper_anchor_string = "";

			for (anchor_string_index=0; anchor_string_index<proper_anchor_level; anchor_string_index++) { 

				proper_anchor_string += "=";

			}



			if (num_H2_anchors == 0) {

				num_errors++;

				error_string = "ERROR " + num_errors + ": H" + prev_anchor_level + " to H" + anchor_level + " jump in the lead section\n";

				error_string += "\tThe correct subheading would be H" + proper_anchor_level + ", which is \"" + proper_anchor_string + temp_anchor_name.replace(/(_+)/ig, " ") + proper_anchor_string + "\" in wiki-markup.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			} else {

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + prev_anchor_level + " to H" + anchor_level + " jump in section \"" + section_name.replace(/(_+)/ig, " ") + "\"\n";

				error_string += "\tThe correct subheading would be H" + proper_anchor_level + ", which is \"" + proper_anchor_string + temp_anchor_name.replace(/(_+)/ig, " ") + proper_anchor_string + "\" in wiki-markup.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

		}





// Check section names

		if (anchor_level > 0) { 

			section_name = temp_anchor.name;

			prev_anchor_level = anchor_level;



			// Compare the heading section name with the anchor section name

			apparent_section_name = section_name;

			span_nodes = sibling_node.getElementsByTagName("SPAN");

			if (span_nodes) { 

				num_span_nodes = span_nodes.length;

				if (num_span_nodes > 0) { 

					for (span_node_index=0; span_node_index<num_span_nodes; span_node_index++) { 

						temp_span_node = span_nodesspan_node_index];

						if (!temp_span_node) { continue; } 



						if (temp_span_node.className == "mw-headline") { 

							apparent_section_name = temp_span_node.innerHTML;

							apparent_section_name = apparent_section_name.replace(/<[^>]+>/ig, "");



							// Check for links in section name

							child_nodes = temp_span_node.getElementsByTagName("A");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has a forbidden hyperlink.\n";

									error_string += "\tSection headings should never have hyperlinks.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node



							// Check for boldface type in section name

							child_nodes = temp_span_node.getElementsByTagName("B");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has boldface formatting.\n";

									error_string += "\tIt is never appropriate to use boldface type in a section heading; see MOS:BOLD.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node



							// Check for italics in section name

							child_nodes = temp_span_node.getElementsByTagName("I");

							if (child_nodes) { 

								num_child_nodes = child_nodes.length;

								if (num_child_nodes > 0) { 

									num_errors++; 

									error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has italics formatting.\n";

									error_string += "\tPlease use italics only for titles of longer works and similar uses; see MOS:ITALICS.\n";

									error_string_list.push(error_string);

									sibling_node.style.cssText = "background-color:red";

								}

							} // closes check for child nodes in span node

						}

					} // closes loop over span nodes

				}

			}

			if (apparent_section_name != section_name.replace(/(_+)/ig, " ")) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" does not agree with its apparent section heading \"" + apparent_section_name + "\".\n";

				error_string += "\tThis may indicate a bad character or a repeated section heading.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for repeats with earlier section headings including article title (section 0)

			for (section_name_index=0; section_name_index<=num_section_names; section_name_index++) { 

				if (section_name.indexOf(section_name_listsection_name_index]) == 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" repeats an earlier section heading \"" + section_name_listsection_name_index + "\" (index " + section_name_index + ").\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} // closes loop over prior section names

			num_section_names++;

			section_name_list.push(apparent_section_name);



			// Check for final colons and other punctuation

			if (section_name.match(/:$/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" should not end in a colon.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for punctuation generally

			if (apparent_section_name.match(/[^A-Za-z0-9,':–\(\)\s\-]/g)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has punctuation or non-English characters.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

			if ((apparent_section_name.match(/\s\-/g)) || (apparent_section_name.match(/\-\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has a spaced hyphen.\n";

				error_string += "\tPlease use hyphens only for compound nouns and adjectives in section headings.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}

			if ((apparent_section_name.match(/\s–/g)) || (apparent_section_name.match(/–\s/g))) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + apparent_section_name + "\" has a spaced en-dash.\n";

				error_string += "\tPlease use en-dashes only for compound nouns and adjectives in section headings.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			// Check for initial capital letter

			if (!section_name.match(/^[A-Z0-9]/)) { 

				num_errors++; 

				error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" does not begin with a capital letter or a digit.\n";

				error_string += "\tPlease capitalize the first word of the heading, but no other words.\n";

				error_string_list.push(error_string);

				sibling_node.style.cssText = "background-color:red";

			}



			words = apparent_section_name.split(' ');

			if (words) { 

				num_words = words.length;

				if (num_words > 0) { 

					if (num_words > 9) { 

						num_errors++; 

						error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has more than nine words (" + num_words + " words).\n";

						error_string_list.push(error_string);

						sibling_node.style.cssText = "background-color:red";

					}



					for (word_index=0; word_index<num_words; word_index++) {

						if ((word_index > 0) && (wordsword_index].match(/^[A-Z]/)) && (!wordsword_index-1].match(/:$/))) { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" is capitalized.\n";

							error_string += "\tPlease capitalize only the first word of a section heading, unless a proper name.\n";

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";	

						}

						temp_word = wordsword_index].substr(1);

						if (!temp_word) { continue; }

						if (temp_word.match(/[A-Z]/))  { 

							num_errors++; 

							error_string = "ERROR " + num_errors + ": Word \"" + wordsword_index + "\" in H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" has internal capital letters.\n";

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";							

						}

					} // closes loop checking the individual words



					first_word = words0].toLowerCase();

					for (word_index=0; word_index<num_forbidden_words; word_index++) {

						forbidden_word = forbidden_first_words_in_section_headingsword_index];

						if (first_word == forbidden_word) {

							num_errors++; 

							error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" begins with a forbidden word \"" + forbidden_word + "\".\n";

							switch (forbidden_word) {

 								case "a":

								case "an":

									error_string += "\tPlease do not start a section heading with an indefinite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "the":

									error_string += "\tPlease do not start a section heading with an definite article such as \"" + forbidden_word + "\".\n";

							 		break;

 								case "in":

								case "on":

								case "for":

								case "out":

								case "with":

								case "from":

								case "about":

								case "around":

								case "through":

								case "without":

								case "against":

									error_string += "\tPlease do not start a section heading with a preposition such as \"" + forbidden_word + "\".\n";

							 		break;



								case "concerning":

									error_string += "\tPlease do not start a section heading with a verb participle such as \"" + forbidden_word + "\".\n";

							 		break;

								case "since":

								case "while":

								case "during":

								case "because":

								case "throughout":

									error_string += "\tPlease do not start a section heading with a conjunction such as \"" + forbidden_word + "\".\n";

							 		break;

								case "my":

								case "your":

								case "yours":

								case "his":

								case "her":

								case "hers":

								case "its":

								case "our":

								case "their":

								case "I":

								case "me":

								case "you":

								case "he":

								case "him":

								case "she":

								case "it":

								case "we":

								case "us":

								case "they":

								case "them":

									error_string += "\tPlease do not start a section heading with a pronoun such as \"" + forbidden_word + "\".\n";

							 		break;

							} // closes switch on the forbidden word

							error_string_list.push(error_string);

							sibling_node.style.cssText = "background-color:red";

							break; // break out of loop over forbidden words

						}

					}

				} // closes check on num_words in section heading

			} // closes check on num_words in section heading

		} // closes check for section anchor 





//Check major section headings for closing sections

		if (anchor_level == 2) { 

			num_H2_anchors++;



			if (section_name.match(/See_also/ig)) { 

				num_See_also_sections++;

				if (num_See_also_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_See_also_sections + " \"See also\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^See_also$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"See also\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Notes_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Notes\" (or \"Footnotes\") section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"References\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if ((section_name.match(/Note/ig)) || (section_name.match(/Footnote/ig))) { 

				num_Notes_sections++;

				if (num_Notes_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Notes_sections + " \"Notes\" (\"Footnotes\") sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^Note$/i)) && (!section_name.match(/^Notes$/i)) && (!section_name.match(/^Footnote$/i)) && (!section_name.match(/^Footnotes$/i)) && (!section_name.match(/^Notes_and_references$/i)) && (!section_name.match(/^Footnotes_and_references$/i)) && (!section_name.match(/^References_and_notes$/i)) && (!section_name.match(/^References_and_footnotes$/i))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"Note\", \"Notes\", \"Footnote\", \"Footnotes\", \"Notes and references\" , \"Footnotes and references\", \"References and notes\" or \"References and footnotes\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"References\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Reference/ig)) { 

				num_References_sections++;

				if (num_References_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_References_sections + " \"References\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^Reference$/ig)) && (!section_name.match(/^References$/ig))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"Reference\" or \"References\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Bibliography\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Bibliography/ig)) { 

				num_Bibliography_sections++;

				if (num_Bibliography_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Bibliography_sections + " \"Bibliography\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^Bibliography$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"Bibliography\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"Further reading\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/Further_reading/ig)) { 

				num_Further_reading_sections++;

				if (num_Further_reading_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_Further_reading_sections + " \"Further reading\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (!section_name.match(/^Further_reading$/ig)) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct form \"Further reading\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": The section \"" + section_name.replace(/(_+)/ig, " ") + "\" should come before the \"External links\" section.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else if (section_name.match(/External_link/ig)) { 

				num_External_links_sections++;

				if (num_External_links_sections > 1) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section \"" + section_name.replace(/(_+)/ig, " ") + "\" makes " + num_External_link_sections + " \"External_links\" sections.\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}



				if ((!section_name.match(/^External_link$/ig)) && (!section_name.match(/^External_links$/ig))) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" does not match correct forms \"External_link\" or \"External_links\".\n";

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} else { 

				if (num_See_also_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"See also\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string); 

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_References_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"References\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_Bibliography_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"Bibliography\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_Further_reading_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after a \"Further reading\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

				if (num_External_links_sections > 0) { 

					num_errors++; 

					error_string = "ERROR " + num_errors + ": Section heading \"" + section_name.replace(/(_+)/ig, " ") + "\" comes after an \"External links\" section.\n";

					error_string += "\tPlease put this before closing sections such as \"See also\", \"References\" and \"External links\".\n"; 

					error_string_list.push(error_string);

					sibling_node.style.cssText = "background-color:red";

				}

			} // closes check for the closing sections

		} // closes check for H2 anchor

	} // closes loop over the anchors



// List the section headings for debugging

	alert_string = "This article has " + num_section_names + " section headings.\n\n";

	alert_string += "\tArticle title: " + article_title + "\n\nSections:\n";

	for (section_name_index=1; section_name_index<=num_section_names; section_name_index++) { 

		alert_string += "\t" + section_name_index + ". " + section_name_listsection_name_index + "\n";

	}

	window.alert(alert_string);



// Print summary of section-heading errors

	if (num_errors < 1) {

		error_string = "No errors in heading levels and order of sections.\n";

		window.alert(error_string); 

		return;

	} else if (num_errors == 1) { 

		initial_error_string = "There is one potential MoS error in the section headings";

	} else { 

		initial_error_string = "There are " + num_errors + " potential MoS errors in the section headings";

	}

	error_string = initial_error_string + ":\n\n";

	for (error_index=0; error_index<num_errors; error_index++) { 

		if ((error_index%max_num_errors_per_alert == 0) && (error_index > 1)) { 

			error_string += "\n\t\t\t\tContinued on next screen...\n";

			window.alert(error_string); 

			error_string = initial_error_string + " (continued from previous screen):\n\n";

		}

		error_string += error_string_listerror_index];

	} // closes loop over errors

	error_string += "\nYou should also check that:\n";

	error_string += "\t1. The section headings are nouns or noun phrases.\n";

	error_string += "\t2. The section headings do not refer to the article title or other section headings.\n";

	window.alert(error_string);



} // closes function checkSectionHeadings()





//******************

// The Main Function

//******************



function checkManualOfStyle() { 



	checkSectionHeadings(); // MOS:HEAD



} // closes function checkManualOfStyle()





addOnloadHook(function () {

mw.util.addPortletLink('p-navigation', 'javascript:checkManualOfStyle()', 'Check MOS:HEAD', 'ca-moscheck', 'Checks for violations of the Manual of Style on section headings', '', '');

});

 

//</pre>

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook