User:Brad606/common.js/typoscan.js
< User:Brad606 | common.js
Note: After saving, changes may not occur immediately. Click here to learn how to bypass your browser's cache.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Cmd-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (Cmd-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Clear the cache in Tools → Preferences
For details and instructions about other browsers, see Wikipedia:Bypass your cache.
Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the central discussion page, Scriptorium. The code will be executed when previewing this page under some skins, including Monobook. You can in the interim if you wish to refresh the content sooner under another skin. |
Documentation for this script can be added at User:Brad606/common.js/typoscan. |
// <nowiki>
// main namespace excluded version
var typoFuse; // overriden by actions.limit
function HighlightTyposUnder( node, actions ){
if( typoFuse >= 0 && node ){
if( node.tagName === "STYLE") {
return;
}
if( node.nodeType == 3 /* TEXT_NODE */ ){
for( var I = 0; I < actions.patterns.length; I++ ){
var pattern = actions.patterns[ I ];
if( node.nodeValue.match( pattern ) ){
if( node.parentNode ){
node.parentNode.innerHTML = node.parentNode.innerHTML.replace( pattern, '<span style="' + actions.styling + '">$&</span>' );
typoFuse--;
}
}
}
}
if( node.childNodes.length ){
for( var subnode=0; subnode < node.childNodes.length; subnode++ ){
if( node.childNodes[ subnode ].getAttribute ){
if( !/pagenumber/.test( node.childNodes[ subnode ].getAttribute( "class" ) ) ){
HighlightTyposUnder( node.childNodes[ subnode ], actions );
}
} else {
HighlightTyposUnder( node.childNodes[ subnode ], actions );
}
}
}
}
}
function HighlightTyposLike( actions ){
self.typoscan = self.typoscan || { exclude: true };
if( !( actions.exclude ) ){ //don't bother scanning historical, edit-in-progress or given ns pages.
var content=document.getElementById('wikiPreview'); //presume currently editing page (must not touch unsafe structures like wpEditToken!)
if( !content ){
content=document.getElementById('mw-content-text'); //user not currently editing: assume safe to address entire display region
}
typoFuse = actions.limit;
for( var N=0; N<actions.groups.length; N++ ){
if( actions.groups[ N ].include ){
HighlightTyposUnder( content, actions.groups[ N ] );
}
}
}
}
self.typoscan={
exclude:
/(action=history|(diff|oldid|search)=|(author|category|extension|file|help|index|mediawiki|meta|module|special|talk|template|topic|user|wiki([mp]edia|source))(:|%3A))/i.test( location.href ),
limit:
40,
groups: [
{
include:
document.evaluate(
"//body[contains(@class,'ns-0')]",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null
).snapshotLength===0, // skip pages in main name-space...
patterns: [
/\\\S/g, // back-slash escape?
/;[.,:]/g, // chained punctuation, semicolon-led
/,[.,;:]/g, // chained punctuation, comma-led
/:[.,;]/g, // chained punctuation, colon-led
/(^|[^'])Ave(?!([.!]| Maria))(\W|$)/g, // typo of "we" (but "'Ave", "Ave." or "Ave Maria" is O.K.)
/\|[-+]?/g, // wikicode leaking into HTML (yes the '?' is dodgy but enlarges the match for table caption/row)
/\Wim(der|desirable|less|productive)/g, // typo of "under"/"undesirable"/"unless"/"unproductive"
/(?!na)vv(?!(ies|y))/g, // typo of "w" (though legitimate in "navvy" or plural)
/(^|\W)Sts?(?!\.)(\W|$)/g, // typo of "St."
/\s["'`;:,!?$%*()=+~]\s/g, // floating punctuation mark: WARNING: modern style: floating "=" OK
/modem/gi, // typo of "modern"
/\w&/g, // embedded or trailing "&"
/&(?!c\.)\w/g, // leading "&" ("&c." O.K.)
/(^|\W)[a-z]+[A-Z]+[A-Za-z]+(\W|$)/g, // upper case embedded within lower case word
/(^|\W)[A-Z]{2,}[a-z]+[A-Za-z]+(\W|$)/g, // lower case embedded within upper case word
/(^|\W)[a-zA-Z]+\d+[a-zA-Z]*(\W|$)/g, // digit embedded within word
/(^|\W)\d+[a-zA-Z]+\d+(\W|$)/g, // alphabetic embedded within digits
/(^|\W)[a-zA-Z]+ \.[a-zA-Z]+(\W|$)/g, // period surrounded by letters
/ tlie /g, // typo of "he"
/li /g, // typo of "h"
/ Av/g, // " w" at the start of the word
/ op /g, // typo of standalone " of "
/lI /g, // typo of "ll" or "h"
/ii/g, // "u" or ü"
/jj/g, // "p" or "g"
/\^/g, // standalone "^"?
/{[[\]]}{1,}/g, // mis-terminated template, link or standalone "^"?
/{[(\)}^]{1,}/g, // plagiarised parenthesis
// What follows are custom expressions looking for things in The URantia Book First edition
/\b[a-z]+(?:[A-Z][a-z]+|[A-Z])\b/g, // lowercase words with capital letter(s) in middle
/[A-Za-z]-\s/g, // hyphenated words that maybe need to be combined
/\s-\s/g, // hypehns that likely should be em-dashes
/[’“”‘’]/g, // curly punctuation marks
/ /g // em spaces are to be avoided, just normal spaces
],
styling:
'background:LightSalmon; padding: 0.3em;'
},
// end of add
]
};
jQuery( document ).ready(
HighlightTyposLike( self.typoscan )
);
// </nowiki>