Jump to content

User:Coemgenus/monobook.js

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.
mw.loader.load('//en.wikipedia.org/w/index.php?title=User%3ADr_pda%2Fprosesize.js&action=raw&ctype=text/javascript'); // [[User:Dr_pda/prosesize.js]]

//Interiot's javascript edit counter
if (document.title.indexOf('User:Interiot/Tool2/code.js') != -1) {
  mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:Interiot/Tool2/code.js&action=raw&ctype=text/javascript'); }



function externISBN() {
  for (var i = 0; i < document.links.length; i++) 
    {       
         var ln = document.links[i].href.match(/isbn=(.*)/);
         if (ln) {
           document.links[i].href='http://www.amazon.com/exec/obidos/ASIN/'+RegExp.$1;
         }
    }

}

addOnloadHook(externISBN);

importScript("User:Lupin/recent2.js");


//Create 'winc' function:
 
function winc(s) {
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=' + s
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
}
 
 
//function to handle dates:
 
importScript('User:Lightmouse/monobook.js/script.js');


/**
 * Metadata assessment script
 * Finds the WP 1.0/WikiProject assessment of every article you go to, then 
 * displays that information in the article header.
 * 
 * @author Outriggr - created the script and used to maintain it
 * @author Pyrospirit - currently maintains and updates the script
 */
 
// Import stylesheet with custom classes for header colors
importStylesheet('User:Pyrospirit/metadata.css');
 
/**
 * This is the constructor for the script object. All functions this script 
 * defines are inside this.
 * 
 * @constructor
 */
MetadataScript = function () {};
 
/**
 * Starts the script object running. The main function of the script. If the 
 * getMainType() function can find the assessment, it uses that assessment 
 * for the page, parses it, and displays it in the header. Otherwise, it runs 
 * ajaxMain().
 */
MetadataScript.prototype.init = function () {
    var initialAssessment = this.checkArticle();
    if ( initialAssessment.exists ) {
        this.currentAssessment = initialAssessment;
        var data = this.talkAssess(this.currentAssessment);
        this.update(data.newClass, data.slogan, data.info);
    }
    else this.ajaxMain();
};
 
/**
 * The main function when an AJAX request is needed to find the assessment. 
 * Creates an AJAX request for the contents of a URL (defaults to the 
 * first section of the article's talk page), then sends the request. After 
 * getting the requested data back, it finds the assessment information in 
 * the data, then uses and displays that assessment in the header.
 * 
 * @param {String} arguments[0] - Optional: override the default URL for the 
 *        AJAX request.
 */
MetadataScript.prototype.ajaxMain = function () {
    if ( arguments[0] && arguments[0].match(/^https?:\/\//i) ) this.url = arguments[0];
    else this.url = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=Talk:' + encodeURIComponent(mw.config.get('wgPageName'))
        + '&action=raw&section=0';
    this.request = sajax_init_object();
    if ( this.request ) {
        var self = this;
        this.request.onreadystatechange = function () {
            if ( this !== self ) {
                arguments.callee.call(self, arguments);
                return;
            }
            if ( this.request.readyState == 4 && this.request.status == 200 ) {
                this.text = this.request.responseText;
                this.currentAssessment = this.findAssessment(this.request.responseText);
                var data = this.talkAssess(this.currentAssessment);
                this.update(data.newClass, data.slogan, data.info);
            }
        };
        this.request.open('GET', this.url, true);
        this.request.send(null);
    }
};
 
/**
 * Checks for various objects on the article page that indicate a certain 
 * assessment, such as a featured star or disambiguation page notice. If this 
 * function can find the assessment, AJAX is not needed for this page.
 * 
 * @return {Object} assess - the assessment in an easily readable format
 * 
 * @static
 */
MetadataScript.prototype.checkArticle = function () {
    var assess = {};
    assess.extra == '';
    assess.exists = true;
    if ( document.getElementById('disambig') )
        assess.rating = 'dab';
    else if ( document.getElementById('contentSub').innerHTML == 'Redirect page' )
        assess.rating = 'redir';
    else if ( document.getElementById('ca-talk').className == 'new' )
        assess.rating = 'none';
    else assess.exists = false;
    return assess;
};
 
/**
 * Searches the provided wikicode for an assessment and returns the 
 * assessment it finds as an object. This function first checks for things 
 * such as former FA/GA status and current FA/GA nominations, then looks for 
 * current assessment status.
 * 
 * Note that a higher assessment takes priority, and less-used assessments 
 * such as "list", "current", or "future" are used only if nothing else can 
 * be found.
 * 
 * @param {String} text - some wikitext to be searched for assessment info
 * 
 * @return {Object} assess - the assessment in an easily readable format
 * 
 * @static
 */
MetadataScript.prototype.findAssessment = function (text) {
    var assess = {};
    var actionNumber = 0;
 
    if ( text.match(/\bclass *= *a\b/i) ) {
        if ( text.match(/\bclass *= *ga\b|\bcurrentstatus *= *(ffa\/)?ga\b/i) )
            assess.rating = 'a/ga';
        else assess.rating = 'a';
    } else if ( text.match(/\bclass *= *ga\b|\bcurrentstatus *= *(ffa\/)?ga\b|\{\{ *ga *\|/i)
               && !text.match(/\bcurrentstatus *= *dga\b/i) ) assess.rating = 'ga';
    else if ( text.match(/\bclass *= *b\b/i) ) assess.rating = 'b';
    else if ( text.match(/\bclass *= *bplus\b/i) ) assess.rating = 'bplus';
    else if ( text.match(/\bclass *= *c\b/i) ) assess.rating = 'c';
    else if ( text.match(/\bclass *= *start/i) ) assess.rating = 'start';
    else if ( text.match(/\bclass *= *stub/i) ) assess.rating = 'stub';
    else if ( text.match(/\bclass *= *list/i) ) assess.rating = 'list';
    else if ( text.match(/\bclass *= *(dab|disambig)/i) ) assess.rating = 'dab';
    else if ( text.match(/\b(class|currentstatus) *= *fl\b/i) ) assess.rating = 'fl';
    else if ( text.match(/\b(class|currentstatus) *= *fa\b/i) ) assess.rating = 'fa';
    else if ( text.match(/\bclass *= *cur(rent)?/i) ) assess.rating = 'cur';
    else if ( text.match(/\bclass *= *future/i) ) assess.rating = 'future';
    else assess.rating = 'none';
 
    assess.pageLink = null;
 
    if ( (assess.reg = text.match(/\{\{ *fac *[\|\}]/i)) ) {
        assess.extra = 'fac';
    } else if ( (assess.reg = text.match(/\{\{ *flc *\}\}/i)) ) {
        assess.extra = 'flc';
    } else if ( (assess.reg = text.match(/\{\{ *ga ?nominee *[\|\}]/i)) ) {
        assess.extra = 'gan';
    } else if ( (assess.reg = text.match(/\{\{ *far(ce?)? *[\|\}]/i)) ) {
        assess.extra = 'far';
    } else if ( (assess.reg = text.match(/\{\{ *flrc *[\|\}]/i)) ) {
        assess.extra = 'flrc';
    } else if ( (assess.reg = text.match(/\{\{ *gar\/link *[\|\}]/i)) ) {
        assess.extra = 'gar';
    } else if ( (assess.reg = text.match(/\bcurrentstatus *= *ffa\b/i)) ) {
        actionNumber = text.match(/\baction(\d\d?) *= *far\b/i)[1];
        assess.extra = 'ffa';
    } else if ( (assess.reg = text.match(/\{\{ *formerfa2?\b/i)) ) {
        assess.extra = 'ffa';
    } else if ( (assess.reg = text.match(/\bcurrentstatus *= *ffl\b/i)) ) {
        assess.extra = 'ffl';
    } else if ( (assess.reg = text.match(/\{\{ *ffl *[\|\}]/i)) ) {
        assess.extra = 'ffl';
    } else if ( (assess.reg = text.match(/\bcurrentstatus *= *dga\b/i)) ) {
        assess.extra = 'dga';
    } else if ( (assess.reg = text.match(/\{\{ *d(elisted)?ga *[\|\}]/i)) ) {
        assess.extra = 'dga';
    } else if ( (assess.reg = text.match(/\baction(\d\d?) *= *fac\b/i)) &&
               !assess.rating.match(/f[al]/i) ) {
        actionNumber = assess.reg[1];
        assess.pageLink = true;
        assess.extra = 'ffac';
    } else if ( (assess.reg = text.match(/\{\{ *fac?(failed|(\-| \()?contested\)?) *[\|\{]/i)) ) {
        assess.extra = 'ffac';
    } else if ( (assess.reg = text.match(/\baction(\d\d?) *= *flc\b/i)) &&
               !assess.rating.match(/f[al]/i) ) {
        actionNumber = assess.reg[1];
        assess.pageLink = true;
        assess.extra = 'fflc';
    } else if ( (assess.reg = text.match(/\baction(\d\d?) *= *gan\b/i)) &&
               !assess.rating.match(/f[al]|(a\/)?ga/i) ) {
        actionNumber = assess.reg[1];
        assess.pageLink = true;
        assess.extra = 'fgan';
    } else if ( (assess.reg = text.match(/\{\{ *f(ailed ?)?ga *[\|\}]/i)) ) {
        assess.extra = 'fgan';
    } else assess.extra = 'none';
 
    if ( assess.pageLink ) {
        var pageLinkPattern = '\\baction' + actionNumber + 'link *= *([^\\n\\|]+)\\s*\\|';
        assess.pageLink = text.match(RegExp(pageLinkPattern))[1];
    }
 
    if ( assess.extra == 'ffa' ) {
        var ffaType = RegExp('\\baction' + actionNumber + 'link *= *Wikipedia:Featured[ _]'
                    + 'article[ _]removal[ _]candidates\\/', 'i');
        assess.ffaPage = text.match(ffaType) ? 'Wikipedia:Featured_article_removal_candidates/'
                       : 'Wikipedia:Featured_article_review/';
    }
 
    assess.exists = true;
    return assess;
}
 
/**
 * Parses an assessment object into the HTML and CSS code needed to update 
 * the article header. If it doesn't recognize a part of the information 
 * given, it will simply ignore it and mark as unassessed.
 * 
 * @param {Object} assess - assessment information for this article
 * 
 * @return {String} newClass - the CSS class corresponding to its assessment
 * @return {String} slogan - HTML giving (with a link) the main assessment
 * @return {String} info - HTML giving (with a link) additional information
 * 
 * @static
 */
MetadataScript.prototype.talkAssess = function (assess) {
    var info = '';
    var path = mw.config.get('wgArticlePath').replace('$1', '');
    var page = encodeURIComponent(mw.config.get('wgPageName'));
    var assessLink = path + 'Wikipedia:Version_1.0_Editorial_Team/Assessment';
    if ( typeof assess.extra === 'undefined' ) assess.extra = '';
    var extra = assess.extra.toLowerCase();
    var rating = assess.rating.toLowerCase();
    var pageLink = assess.pageLink ? encodeURIComponent(assess.pageLink.replace(' ', '_')) : null;
 
    if ( extra == 'fac' ) {
        info = '. <i>Currently a <a href="' + path + 'Wikipedia:Featured_article_candidates/'
             + page + '">featured article candidate</a></i>.';
    }
    else if ( extra == 'flc' ) {
        info = '. <i>Currently a <a href="' + path + 'Wikipedia:Featured_list_candidates/'
             + page + '">featured list candidate</a></i>.';
    }
    else if ( extra == 'gan' ) {
        info = '. <i>Currently a <a href="' + path + 'Wikipedia:Good_article_nominations">'
             + 'good article nominee</a></i>.';
    }
    else if ( extra == 'far' ) {
        info = '. <i>Currently undergoing <a href="' + path + 'Wikipedia:Featured_article_review/'
             + page + '">review</a> of its featured status</i>.';
    }
    else if ( extra == 'flrc' ) {
        info = '. <i>Currently a <a href="' + path + 'Wikipedia:Featured_list_removal_'
             + 'candidates/' + page + '">candidate</a> for removal as a featured list</i>.';
    }
    else if ( extra == 'gar' ) {
        info = '. <i>Currently undergoing a <a href="' + path + 'Wikipedia:Good_article_'
             + 'reassessment">reassessment</a> of its status as a good article</i>.';
    }
    else if ( extra == 'ffa' ) {
        info = '. <i>A <a href="' + path + assess.ffaPage + page + '">former</a>'
             + ' featured article</i>.';
    }
    else if ( extra == 'ffl' ) {
        info = '. <i>A <a href="' + path + 'Wikipedia:Featured_list_removal_candidates/'
             + page + '">former</a> featured list</i>.';
    }
    else if ( extra == 'dga' ) {
        info = '. <i>A <a href="' + path + 'Wikipedia:Good_article_reassessment">delisted</a> '
             + 'good article</i>.';
    }
    else if ( extra == 'ffac' ) {
        info = '. <i>A former <a href="' + path + (pageLink ? pageLink
             : 'Wikipedia:Featured_article_candidates/' + page) + '">featured article '
             + 'candidate</a></i>.';
    }
    else if ( extra == 'fflc' ) {
        info = '. <i>A former <a href="' + path + (pageLink ? pageLink
             : 'Wikipedia:Featured_list_candidates/' + page) + '">featured list candidate'
             + '</a></i>.';
    }
    else if ( extra == 'fgan' ) {
        info = '. <i>A former <a href="' + path + (pageLink ? pageLink
             : 'Wikipedia:Good_article_nominations') + '">good article nominee</a></i>.';
    }
 
    if ( rating == 'a' || rating == 'a/ga' ) {
        newClass = 'assess-A-text';
        slogan = 'An <a href="' + assessLink + '">A-class</a> article';
        if ( rating == 'a/ga' ) {
            if ( info.length == 0 ) info += '.';
            info += ' <i>Also a <a href="' + path + 'Wikipedia:Good_Articles">good article</a>.'
        }
    }
    else if ( rating == 'ga' ) {
        newClass = 'assess-GA-text';
        slogan = 'A <a href="' + path + 'Wikipedia:Good_Articles">good article</a>'
    }
    else if ( rating == 'b' ) {
        newClass = 'assess-B-text';
        slogan = 'A <a href="' + assessLink + '">B-class</a> article';
    }
    else if ( rating == 'bplus' ) {
        newClass = 'assess-Bplus-text';
        slogan = 'A <a href="' + path + 'Wikipedia:WikiProject_Mathematics/Wikipedia_1.0'
               + '/Grading_scheme">B-plus-class</a> article';
    }
    else if ( rating == 'c' ) {
        newClass = 'assess-C-text';
        slogan = 'A <a href="' + assessLink + '">C-class</a> article';
    }
    else if ( rating == 'start' ) {
        newClass = 'assess-Start-text';
        slogan = 'A <a href="' + assessLink + '">start-class</a> article';
    }
    else if ( rating == 'stub' ) {
        newClass = 'assess-Stub-text';
        slogan = 'A <a href="' + assessLink + '">stub-class</a> article';
    }
    else if ( rating == 'list' ) {
        newClass = 'assess-List-text';
        slogan = 'A <a href="' + path + 'Wikipedia:Lists">list-class</a> article';
    }
    else if ( rating == 'dab' ) {
        newClass = 'assess-Dab-text';
        slogan = 'A <a href="' + path + 'Wikipedia:Disambiguation">disambiguation page</a>';
    }
    else if ( rating == 'redir' ) {
        newClass = 'assess-Redir-text';
        slogan = 'A <a href="' + path + 'Help:Redirect">redirect page</a>';
    }
    else if ( rating == 'fl' ) {
        newClass = 'assess-FA-text';
        slogan = 'A <a href="' + path + 'Wikipedia:Featured_lists">featured list</a>';
    }
    else if ( rating == 'fa' ) {
        newClass = 'assess-FA-text';
        slogan = 'A <a href="' + path + 'Wikipedia:Featured_articles">featured article</a>';
    }
    else if ( rating == 'cur' ) {
        newClass = 'assess-Cur-text';
        slogan = 'A <a href="' + path + 'Portal:Current_events">current-class</a> article';
    }
    else if ( rating == 'future' ) {
        newClass = 'assess-Future-text';
        slogan = 'A <a href="' + path + 'Category:Future-Class_articles">future-class</a>'
               + ' article';
    }
    else {
        newClass = '';
        slogan = 'An <a href="' + assessLink + '">unassessed</a> article';
    }
    return {newClass: newClass, slogan: slogan, info: info};
};
 
/**
 * Updates article header with new assessment information by giving it a new 
 * class (for style information such as color) and altering the tagline below 
 * it to state the assessment found.
 * 
 * @param {String} newClass - the CSS class name added to the article header
 * @param {String} slogan - italicized text prepended to the tagline, showing 
 *        the article's main assessment
 * @param {String} info - additional assessment info appended to the tagline
 *
 * @static
 */
MetadataScript.prototype.update = function (newClass, slogan, info) {
    var firstHeading = document.getElementsByTagName('h1')[0];
    firstHeading.className += ' ' + newClass;
    document.getElementById('siteSub').innerHTML = '<i>' + slogan + '</i>'
        + ' from Wikipedia, the free encyclopedia' + info;
};
 
/**
 * Creates the global MetadataObject as an instance of MetadataAssessmentScript, then 
 * calls the init() method of MetadataObject to start the script.
 */
if ( mw.config.get('wgNamespaceNumber') == 0 && (mw.config.get('wgAction') == 'view' || mw.config.get('wgAction') == 'purge')
    && mw.config.get('wgPageName') != 'Main_Page' ) {
    addOnloadHook(function () {
        if (typeof MetadataObject === 'undefined') {
            MetadataObject = new MetadataScript();
        }
        MetadataObject.init();
    });
}

importScript('User:Plastikspork/date.js')
 
function autoEdDashes (str)
{
  if (str.search(/nodashes/i) >= 0)
    return str;
 
  var scpat = /\bscores?\b|\[\[Category:.*\b(sport|athlet|players|teams|games|league|champion|tournament|competit|cup\b|\w+ball\b|hockey|lacrosse|cricket|rugby|tennis|golf|polo|boxing|boxers|martial.art|chess)/i;
  var scoresAreLikely = (str.search(scpat) >= 0);
 
  // Ensure the replacement isn't a link such as [[FOO - BAR]] before
  // replacing it, so that we don't break the link. But we do want to
  // replace dashes used in the right-side label part of links.  Also,
  // don't break templates, URLs, DOIs, {{#expr:}}, <math> equations,
  // source code, or <ref name="13-70">.
  //
  function ifNotLink (str)
  {
    var pos    = arguments[ arguments.length - 2 ];
    var string = arguments[ arguments.length - 1 ];
 
    var pat = /\[\[[^|\]]*$|\{\{[^|}]*$|[:\/%][^\s|>]+$|<[^>]*$|#\w*expr:.*$/i;
    if (string.substring(pos-260,pos+1).search(pat) >= 0)
        return str;             // it's a link, so don't change it
 
    var pat2 = /\{\{(main|see|detail|about|for\b|other|redir|conv|coor)[^}]*$/i;
    if (string.substring(pos-260,pos+1).search(pat2) >= 0)
        return str;             // likely templates with page-name or neg params
 
    var m = string.slice(pos).search(/<\/?(math|pre|code|tt|source|syntaxhighlight)\b/i);
    if (m >= 0 && string.charAt(pos+m+1) == '/')
        return str;             // don't break a <math> equation, or source code
 
    if (string.slice(pos).search(/^[^|{}[\]<>\n]*\.[a-z]{3,4}\s*[|}]|^.*hyphen/i) >= 0)
        return str;             // it's a file name parameter, or <!--sic hyphen-->
 
    if (str.search(/[ |(>][-–]\b/) >= 0)
        return str.replace(/[-–]/, "−");       // minus sign
    else
        return str.replace(/--+\b/g, "—") . replace(/[-–−]+/g, "–");     // dash
  }
 
  str = str.replace(/\s--?\s/g, ifNotLink);                 // en dash looks better
  str = str.replace(/[a-z\d]---?[a-z\d]/ig, ifNotLink);     // em dash
  str = str.replace(/\d\d\d]*}*[-−](present|current)\b/ig, ifNotLink);       // 1973-present
  str = str.replace(/[^\w−-](18|19|20)\d\d]*}*[-−][^\w−-]/g, ifNotLink);     // (1973-)
  str = str.replace(/\d(s|%|\?|''')[-−]\d/g, ifNotLink);    // 1950s-1960s, 40%-50%
  str = str.replace(/\d[-−](\$|'+)\d/g, ifNotLink);         // $40-$50, 7-'''4''', '49-'53
  str = str.replace(/[½⅓⅔¼¾⅛⅜⅝⅞]%?[-−][\d½⅓⅔¼¾⅛⅜⅝⅞]/g, ifNotLink);           // 3½-6
  str = str.replace(/\d(st|nd|rd|th)?[-−]\d+(st|nd|rd|th)\b/g, ifNotLink);   // 2nd-3rd
 
  str = str.replace(/([a-z,'"”\]>] +|\(|^\| *|\|\| *)[-–]\d/mig, ifNotLink);   // minus -35
  str = str.replace(/<((sup|sub|td)>\s*)[-–](\d)/ig, "<$1−$3");         // 10<sup>-3</sup>
  str = str.replace(/,*(?=.? ) *[-–—−] *(\d*:\d\d[\s*<])/g, " – $1");   // album track listings
 
  // November 15, 2005-March 7, 2006; [[March 18]]-[[April 4]]
  str = str.replace(/(\d\]*)[-–—−](\[*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* +\d)/g, "$1 – $2");
  // July-August 2007
  str = str.replace(/\b((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*[-−]?\b){2,}/g, ifNotLink);
  // [[266]]-[[283]]
  str = str.replace(/(\d(?: BC)?\]\])[-−]((ca?\.|AD ?)?\[\[\d+[^\d-])/g, "$1–$2");
  // (1984 – 1992)
  str = str.replace(/([(|=] *\[*\d+\]*) +[–—−] +(\[*\d+\]*\s*[)|}])/g, "$1–$2");
  // iv-xii
  str = str.replace(/[ ;(=](?=\w+-)(m*(cm|cd|d?c*)(xc|xl|l?x*)(ix|iv|v?i*)-?\b){2}[^\w-]/g, ifNotLink);
 
  if (scoresAreLikely)      // W-L-D or 73–70–67–70=280, but not castling
    str = str.replace(/[^\w−–-](?!0-0-0)(\d\d?\d?[-–−]){2,}\d\d?[^\w\/−–-]/g, ifNotLink);
 
  str = str.replace(/\b(\d+)[–−](year|month|day|hour|minute|mile|yard|foot|inch|bit|door|speed|gun|page|seat|way|point|ton|man)\b/g, "$1-$2");     // hyphen
 
  // Number ranges and scores should use en dashes, per [[MOS:DASH]].
  // This has been well-tested and false positives (e.g., ID nos.) are rare.
  //
  function range (str, from,to, pos,string)
  {
    var dash   = true;
    var except = /\b(fig(ure)?|table|example|exhibit|circular|section|part|number|no|nr|id|model|pub|std|report|rpt|law|P?L|p|page|date|IS\wN\b[ a-z]*)[^\w(,;]*$/i;
    var rpat   = /^([^A-Za-z]|nbsp)*(AD|BC|B?CE|BP|[kMG]a|km|mi|kg|lb|\w?Hz|vote|decision|record|odds|scor\w*|win|loss|tie|draw|lead|victory|defeat|upset|run|deficit|start|finish|season|game)\b/;
    var lpat   = /\b(pages|pp|rp|nos|\d+\)?'*[:,]|(w[io]n|lost?|tie|dr.w|lea?d|f.ll|vot|rul|decid|pass|fail|defeat|scor|gam|match|trail|finish|end)e?[ds]?|\w\w+ing|ahead|behind|up|down|from|to|is|are|was|were|of|out|by|an?|at|it|went|go|gone|beaten|between)([^a-z]|nbsp)*$/i;
    var inorder   = (to-0 > from.slice(-to.length));     // pp 362-5
    var precision = Math.max( from.search(/0*$/), to.search(/0*$/) );
 
    if (string.substring(pos-20,pos+1).search(except) >= 0) {
        return str;      // based on preceding word, looks like a ref number
    }
    if (from == 9 && to == 11) {
        dash = false;    // 9-11 is a common special case
    }
    if (from-0 >= to) {
        dash = false;    // values don't look like a range
    }
    if (to-from > 120 && from * (precision > 2 ? 5 : 50) < to && from > 1) {
        dash = false;    // values don't look like a range
    }
    if (scoresAreLikely && from <= 900 && to <= 900) {
        dash = true;     // likely a score or wins-losses
    }
    if (from < 2-to && string.search(/Category:.*\bChess\b/i) >= 0) {
        dash = false;    // chess notations 0-0, 0-1, 1-0
    }
    if (str.charAt(0) == '(' && string.charAt(pos + str.length) == ')') {
        dash = true;     // scores often seen as (8-4)
    }
    if (from.search(/^0./) >= 0 || to.search(/^0./) >= 0) {
        dash = false;    // 3-07 and 0123-4567 look like ref numbers
    }
    if (string.substr(pos-1,15).search(/^\d([:,.])\d+.\d+\1\d/) >= 0) {
        dash = true;     // 10:30-11:30, 35,000-40,000, 2.5-4.0
    }
    if (string.substr(pos,30).search(rpat) >= 0) {
        dash = true;     // 12-5 BC, 5-5000&nbsp;km, 6-4 win, 73-50 vote
    }
    if (string.substring(pos-80,pos).search(lpat) >= 0) {
        dash = true;     // pp.&nbsp;8, 25, 270-74, 313-7; won 6-4, 6-2
    }
    if (from > 1000 && from < 2100 && to.length == 2 && inorder) {
        dash = true;     // 1994-95 year range
    }
    return dash ? ifNotLink(str,pos,string) : str;
  }
 
  str = str.replace(/[^\w\/+−–-](\d{1,4})[-−](\d{1,4})(?!'*[\w\/+−–-])/g, range);
 
  return str;
}
 
 
//  Hook to allow using this tool "standalone"
 
if (importScript("Wikipedia:AutoEd/core.js"))   // if not otherwise using AutoEd
{
    function autoEdFunctions() {
        var txt = document.editform.wpTextbox1;
        var str = txt.value;
        str = str.replace(/&mdash;/g, '—');
        str = str.replace(/&ndash;/g, '–');
        str = str.replace(/&minus;/g, '−');
        txt.value = autoEdDashes( str );
    }
    autoEdLinkName  = "–";
    autoEdLinkHover = "Fix dashes, hyphens, and minus signs";
    autoEdTag       = "fixed [[MOS:DASH|dashes]] using a [[User:GregU/dashes.js|script]]";
}