User:Rufus Rose/common.js/Typoscan.js

//

// main namespace included version var typoFuse; // overriden by actions.limit

function HighlightTyposUnder( node, actions ){ if( typoFuse >= 0 && node ){ 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, '$& ' ); 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"        /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 ) );

//