//<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(/^/)) {
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(//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) && (words.match(/^/)) && (!words.match(/:$/))) {
num_errors++;
error_string = "ERROR " + num_errors + ": Word \"" + words + "\" 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 = words.substr(1);
if (!temp_word) { continue; }
if (temp_word.match(//)) {
num_errors++;
error_string = "ERROR " + num_errors + ": Word \"" + words + "\" 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 = words.toLowerCase();
for (word_index=0; word_index<num_forbidden_words; word_index++) {
forbidden_word = forbidden_first_words_in_section_headings;
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 = anchors;
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_nodes;
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_list) == 0) {
num_errors++;
error_string = "ERROR " + num_errors + ": H" + anchor_level + " section \"" + section_name.replace(/(_+)/ig, " ") + "\" repeats an earlier section heading \"" + section_name_list + "\" (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(//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(/^/)) {
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) && (words.match(/^/)) && (!words.match(/:$/))) {
num_errors++;
error_string = "ERROR " + num_errors + ": Word \"" + words + "\" 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 = words.substr(1);
if (!temp_word) { continue; }
if (temp_word.match(//)) {
num_errors++;
error_string = "ERROR " + num_errors + ": Word \"" + words + "\" 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 = words.toLowerCase();
for (word_index=0; word_index<num_forbidden_words; word_index++) {
forbidden_word = forbidden_first_words_in_section_headings;
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_list + "\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_list;
} // 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>