Skip to content

Instantly share code, notes, and snippets.

@derickfay
Last active March 2, 2019 04:50
Show Gist options
  • Save derickfay/240eca32d3584a1c6afd4d97611618f0 to your computer and use it in GitHub Desktop.
Save derickfay/240eca32d3584a1c6afd4d97611618f0 to your computer and use it in GitHub Desktop.
Date text formatter for Copied
// 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