User:Prospectprospekt/common.js/typoscan.js
Appearance
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 user script can be added at User:Prospectprospekt/common.js/typoscan. |
// <nowiki>
// main namespace included 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:
true, // this group applies to all pages not already excluded
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"
/[Ww]ide-spread/g, // hyphenation inconsistency in progress and poverty
/[Ww]idespread/g, // hyphenation inconsistency in progress and poverty
/[Tt]oday/g,
/er then/g,
/[Pp]rovod/g,
/harmonics[ ,.:;"']/g,
/ fold[ ,.:;"']/g,
/ [Ss]en[ ,.:;"']/g,
/ [Pp]ic[s ,.:;"']/g,
/ ovil[ ,.:;"']/g,
/tho[ ,.:;"']/g,
/l'm/g,
/ [Nn][eo]w[ ,.:;"']/g,
/ [Tt]hose[ ,.:;"']/g,
/l'd/g,
/l'l/g,
/l'se/g,
/- /g,
/ſ/g,
/ [Mm]orely[ ,.:;"']/g,
/ [Mm]on[ ,.:;"']/g,
/ oar[s ,.:;"']/g,
/Tho[ ,.:;"']/g,
/lotter/g,
/roader/g,
/boon /g,
/[Dd]oter[ ,.:;"']/g,
/ rot[ ,.:;"']/g,
/[Ss]ago[ ,.:;"']/g,
/[Gg]roat[ ,.:;"']/g,
/mcr/g,
/ [Cc]ense[ ,.:;"']/g,
/[Ww]hoso[ ,.:;"']/g,
/, Th/g,
/, Also/g,
/[Ll]argo[ ,.:;"']/g,
/[Tt]ines[ ,.:;"']/g,
/, Almost/g,
/, It/g,
/, With/g,
/, Wh/g,
/ /g,
/bold/g,
/follow/g,
/<ref> /g,
/\. [a-z]/g,
/wide spread/g,
/clorks/g,
/mako/g,
/ arc /g,
/ [Tt]ics[ ,.:;"']/g,
/ [Rr]end[ ,.:;"']/g,
/ doos/g,
/ ot /g,
/ Ho /g,
/ lino /g,
/ Lino /g,
/ [Ss]ook[ .,:;"']/g,
/ carn[ .,:;"']/g,
/ wore /g,
/ Wore /g,
/ carly[ ,.;:]/g,
/ooperat/g,
/whore/g,
/ [Ss]ot[ ,.;:]/g,
/ [Hh]ut[ ,.;:]/g,
/ soe[ ,.;:"]/g,
/ fow[ ,.;:"]/g,
/Whore/g,
/ be is /g,
/thcr/g,
/ bas /g,
/bcc/g,
/ louse/g,
/ fool[ ,.;:]/g,
/ bis[ ,.;:]/g,
/ [Aa]rid[ ,.;:]/g,
/ exorci/g,
/ oven[ ,.;:]/g,
/ chock/g,
/ sock/g,
/a more/g,
/ heen /g,
/ be has /g,
/ be's/g,
/ ho /g,
/ laud /g,
/ Laud /g,
/ Sho /g,
/ docs/g,
/ Docs /g,
/ truck /g,
/cither/g,
/Cither/g,
/tivo[ ,.;:]/g,
/cheek/g,
/[ЁёА-я]/g,
/ como /g,
/ [Ss]ec[ ,.;:]/g,
/ bc/g,
/ bo[ ,.;:]/g,
/ [Ww]o[ ,.;:]/g,
/ sho /g,
/ tor /g,
/clement/g,
/[Rr]ather then/g,
/ncss/g,
/ if is /g,
/thore /g,
/thoro /g,
/thero /g,
/ mero /g,
/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
],
styling:
'background:LightSalmon;'
},
// end of add
]
};
jQuery( document ).ready(
HighlightTyposLike( self.typoscan )
);
// </nowiki>