Last active
March 2, 2019 04:50
-
-
Save derickfay/240eca32d3584a1c6afd4d97611618f0 to your computer and use it in GitHub Desktop.
Date text formatter for Copied
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// there are two parts to this text formatter. Both draw heavily from | |
// the date calculation snippets created by Brett Terpstra - see | |
// https://brettterpstra.com/2015/06/01/textexpander-5-javascript-snippets/ | |
// part 1 - the date library | |
// strftime for JS <http://hacks.bluesmoon.info/strftime/> | |
Date.prototype.locale = 'en-GB'; | |
Date.ext = {}; | |
Date.ext.util = {}; | |
Date.ext.util.xPad=function(x, pad, r) | |
{ | |
if(typeof(r) == 'undefined') | |
{ | |
r=10; | |
} | |
for( ; parseInt(x, 10)<r && r>1; r/=10) | |
x = pad.toString() + x; | |
return x.toString(); | |
}; | |
Date.ext.locales = { }; | |
Date.ext.locales.en = { | |
a: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], | |
A: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], | |
b: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], | |
B: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], | |
c: '%a %d %b %Y %T %Z', | |
p: ['AM', 'PM'], | |
P: ['am', 'pm'], | |
x: '%d/%m/%y', | |
X: '%T' | |
}; | |
Date.ext.locales['en-US'] = Date.ext.locales.en; | |
Date.ext.locales['en-US'].c = '%a %d %b %Y %r %Z'; | |
Date.ext.locales['en-US'].x = '%D'; | |
Date.ext.locales['en-US'].X = '%r'; | |
Date.ext.locales['en-GB'] = Date.ext.locales.en; | |
Date.ext.locales['en-AU'] = Date.ext.locales['en-GB']; | |
Date.ext.formats = { | |
a: function(d) { return Date.ext.locales[d.locale].a[d.getDay()]; }, | |
A: function(d) { return Date.ext.locales[d.locale].A[d.getDay()]; }, | |
b: function(d) { return Date.ext.locales[d.locale].b[d.getMonth()]; }, | |
B: function(d) { return Date.ext.locales[d.locale].B[d.getMonth()]; }, | |
c: 'toLocaleString', | |
C: function(d) { return Date.ext.util.xPad(parseInt(d.getFullYear()/100, 10), 0); }, | |
d: ['getDate', '0'], | |
e: ['getDate', ' '], | |
g: function(d) { return Date.ext.util.xPad(parseInt(Date.ext.util.G(d)/100, 10), 0); }, | |
G: function(d) { | |
var y = d.getFullYear(); | |
var V = parseInt(Date.ext.formats.V(d), 10); | |
var W = parseInt(Date.ext.formats.W(d), 10); | |
if(W > V) { | |
y++; | |
} else if(W===0 && V>=52) { | |
y--; | |
} | |
return y; | |
}, | |
H: ['getHours', '0'], | |
I: function(d) { var I=d.getHours()%12; return Date.ext.util.xPad(I===0?12:I, 0); }, | |
j: function(d) { | |
var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT'); | |
ms += d.getTimezoneOffset()*60000; | |
var doy = parseInt(ms/60000/60/24, 10)+1; | |
return Date.ext.util.xPad(doy, 0, 100); | |
}, | |
m: function(d) { return Date.ext.util.xPad(d.getMonth()+1, 0); }, | |
M: ['getMinutes', '0'], | |
p: function(d) { return Date.ext.locales[d.locale].p[d.getHours() >= 12 ? 1 : 0 ]; }, | |
P: function(d) { return Date.ext.locales[d.locale].P[d.getHours() >= 12 ? 1 : 0 ]; }, | |
S: ['getSeconds', '0'], | |
u: function(d) { var dow = d.getDay(); return dow===0?7:dow; }, | |
U: function(d) { | |
var doy = parseInt(Date.ext.formats.j(d), 10); | |
var rdow = 6-d.getDay(); | |
var woy = parseInt((doy+rdow)/7, 10); | |
return Date.ext.util.xPad(woy, 0); | |
}, | |
V: function(d) { | |
var woy = parseInt(Date.ext.formats.W(d), 10); | |
var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay(); | |
// First week is 01 and not 00 as in the case of %U and %W, | |
// so we add 1 to the final result except if day 1 of the year | |
// is a Monday (then %W returns 01). | |
// We also need to subtract 1 if the day 1 of the year is | |
// Friday-Sunday, so the resulting equation becomes: | |
var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1); | |
if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4) | |
{ | |
idow = 1; | |
} | |
else if(idow === 0) | |
{ | |
idow = Date.ext.formats.V(new Date('' + (d.getFullYear()-1) + '/12/31')); | |
} | |
return Date.ext.util.xPad(idow, 0); | |
}, | |
w: 'getDay', | |
W: function(d) { | |
var doy = parseInt(Date.ext.formats.j(d), 10); | |
var rdow = 7-Date.ext.formats.u(d); | |
var woy = parseInt((doy+rdow)/7, 10); | |
return Date.ext.util.xPad(woy, 0, 10); | |
}, | |
y: function(d) { return Date.ext.util.xPad(d.getFullYear()%100, 0); }, | |
Y: 'getFullYear', | |
z: function(d) { | |
var o = d.getTimezoneOffset(); | |
var H = Date.ext.util.xPad(parseInt(Math.abs(o/60), 10), 0); | |
var M = Date.ext.util.xPad(o%60, 0); | |
return (o>0?'-':'+') + H + M; | |
}, | |
Z: function(d) { return d.toString().replace(/^.*\(([^)]+)\)$/, '$1'); }, | |
'%': function(d) { return '%'; } | |
}; | |
Date.ext.aggregates = { | |
c: 'locale', | |
D: '%m/%d/%y', | |
h: '%b', | |
n: '\n', | |
r: '%I:%M:%S %p', | |
R: '%H:%M', | |
t: '\t', | |
T: '%H:%M:%S', | |
x: 'locale', | |
X: 'locale' | |
}; | |
Date.ext.aggregates.z = Date.ext.formats.z(new Date()); | |
Date.ext.aggregates.Z = Date.ext.formats.Z(new Date()); | |
Date.ext.unsupported = { }; | |
Date.prototype.strftime=function(fmt) | |
{ | |
if(!(this.locale in Date.ext.locales)) | |
{ | |
if(this.locale.replace(/-[a-zA-Z]+$/, '') in Date.ext.locales) | |
{ | |
this.locale = this.locale.replace(/-[a-zA-Z]+$/, ''); | |
} | |
else | |
{ | |
this.locale = 'en-GB'; | |
} | |
} | |
var d = this; | |
while(fmt.match(/%[cDhnrRtTxXzZ]/)) | |
{ | |
fmt = fmt.replace(/%([cDhnrRtTxXzZ])/g, function(m0, m1) | |
{ | |
var f = Date.ext.aggregates[m1]; | |
return (f == 'locale' ? Date.ext.locales[d.locale][m1] : f); | |
}); | |
} | |
var str = fmt.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g, function(m0, m1) | |
{ | |
var f = Date.ext.formats[m1]; | |
if(typeof(f) == 'string') { | |
return d[f](); | |
} else if(typeof(f) == 'function') { | |
return f.call(d, d); | |
} else if(typeof(f) == 'object' && typeof(f[0]) == 'string') { | |
return Date.ext.util.xPad(d[f[0]](), f[1]); | |
} else { | |
return m1; | |
} | |
}); | |
d=null; | |
return str; | |
}; | |
function getNextDay(day, resetTime){ | |
day = day.slice(0,3).toLowerCase(); | |
var days = { | |
sun: 0, mon: 1, tue: 2, | |
wed: 3, thu: 4, fri: 5, sat: 6 | |
}; | |
var dayIndex = days[day]; | |
if (dayIndex < 0 || dayIndex > 6) { | |
throw new Error('"' + day + '" is not a valid input.'); | |
} | |
var returnDate = new Date(); | |
var returnDay = returnDate.getDay(); | |
if (dayIndex !== returnDay) { | |
returnDate.setDate(returnDate.getDate() + (dayIndex + (7 - returnDay)) % 7); | |
} else { | |
returnDate.setDate(returnDate.getDate() + 7); | |
} | |
if (resetTime) { | |
returnDate.setHours(0); | |
returnDate.setMinutes(0); | |
returnDate.setSeconds(0); | |
returnDate.setMilliseconds(0); | |
} | |
return returnDate; | |
} | |
// part 2: | |
// convert date strings in Copied clippings to dates | |
// Return true if the clipping can be reformatted with this script. | |
// updated to avoid showing the formatter where it's not relevant | |
var validDates = ["Today", "Tomorrow", "Next Monday", "Next Tuesday", "Next Wednesday", "Next Thursday", "Next Friday", | |
"Next Saturday", "Next Sunday", "Yesterday"] | |
function canFormat(clipping) { | |
return validDates.indexOf(clipping.text) > -1 | |
} | |
// Process data and return a new/updated clipping object or a string. | |
function format(clipping) { | |
var fmt = '%Y-%m-%d'; | |
var today = new Date(); | |
var tomorrow = new Date(today.getTime() + (24 * 60 * 60 * 1000)); | |
var yesterday = new Date(today.getTime() - (24 * 60 * 60 * 1000)); | |
switch(clipping.text) { | |
case "Today": | |
case "today": | |
text = today.strftime(fmt); | |
break; | |
case "Tomorrow": | |
text = tomorrow.strftime(fmt); | |
break; | |
case "Yesterday": | |
text = yesterday.strftime(fmt); | |
break; | |
case "Next Monday": | |
var day = 'Mon' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Tuesday": | |
var day = 'Tues' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Wednesday": | |
var day = 'Weds' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Thursday": | |
var day = 'Thur' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Friday": | |
var day = 'Fri' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Saturday": | |
var day = 'Sat' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
case "Next Sunday": | |
var day = 'Sun' | |
var nextDay = getNextDay(day, true); | |
text = nextDay. strftime(fmt); | |
break; | |
default: | |
text = "I have never heard of that date..."; | |
} | |
return text | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment