User:Quarl/date canonicalize.js

// User:Quarl/date_canonicalize.js - canonicalizes date WikiLinks

// Example: July 17, 1982 becomes 1982-07-17

// requires: wikipage.js, util.js, addlilink.js, datetime.js

// quarl 2006-01-31 initial version

//

datez = new autoedit(   'datez',    'DateZ',    'ca-datez',    'Canonicalize dates',    'Date canonicalization');

// Return a string for a regexp that matches possibly wiki-linked dates in // various date formats. This is a monster regexp, the hardest part of this // script! datez.buildRegExp = function {

var groupIfNeccessary = function(s) { // I don't know a good way to check against e.g. "(foo)|(bar)"; for now just be conservative in adding grouping if (s.match(/\|/) /*&& !s.match(/^\(/) */ ) {           return '(?:' + s + ')';        } else {            return s;        }    }

var joinRE = function { // desplice arguments var args = Array.concat.apply(Array, arguments).map(groupIfNeccessary);

return '(?:' + args.join('|') + ')'; }

var linked = function(s) { return '\\[\\[ *'+s+' *\\]\\]'; }

var maybelinked = function(s) { return joinRE(linked(s), s); }

var abbrevMonth = function(s) { return s.substr(0,3); }

var word = function(s) { return '\\b' + s + '\\b'; }

var year4 = word('[012][0-9][0-9][0-9]'); var year42 = word(joinRE(year4, '[890][0-9]')); var month = word(joinRE('0?[1-9]', '1[012]')); // monthnames is in datetime.js   var monthS = word(joinRE(monthnames, monthnames.map(abbrevMonth))); var day = word('[0123]?[0-9](?:\'?st|nd|th)?');

var delimz = '[ ,/-]+';

var all = joinRE(       // YYYY-MM-DD formats        linked( year4 + '-' + month + '-' + day ),        maybelinked(year4)+'-'+maybelinked(month+'-'+day),        maybelinked(year4)+'/'+month+'/'+day,        maybelinked(year4)+'\\.'+month+'\\.'+day,        year4 + ' ' + month + ' ' + day,

maybelinked(year4 + delimz + monthS + delimz + day),

// MM-DD-YYYY formats month + '-' + day + '-' + year4, month + '/' + day + '/' + year42,

linked(monthS + delimz + day + delimz + year42), maybelinked(monthS + delimz + day) + delimz + maybelinked(year42), linked(monthS) + delimz + linked(day) + delimz + '(?:of\s*)?' + linked(year42),

// DD-MM-YYYY formats: only support monthS, because it's ambiguous // otherwise linked( day + delimz + monthS + delimz + year4 ), maybelinked(day + delimz + monthS) + delimz + maybelinked(year4) );   return new RegExp(all, 'i'); }

datez.replaceRegExp = function(d, m) { s = m[0]; s = s.replace(/[\[\]]/g, ''); s = s.replace(/[-.]/g, '/'); // Date only understands '/' as delimiter var d = new Date(s); // parses date string

if (!d.getFullYear) { // couldn't parse return null; }

return  + datestampUTCISO(d) + ; }

datez._load = function { datez.addTab; }

addOnloadHook(datez._load);

//