|
// Variables used by Scriptable. |
|
// These must be at the very top of the file. Do not edit. |
|
// icon-color: purple; icon-glyph: calendar-alt; |
|
const spaceDays = 5 |
|
const dayFont = new Font('verdana', 10.5) |
|
const dayColor = new Color('fff') |
|
const todayHilite = new Color('DBD5B5') |
|
const todayColor = new Color('284B63') |
|
const dayXColor = new Color('#ddd', 0.5) |
|
const monthColor = new Color('#CC3F0C') |
|
const yearColor = new Color('#9A6D38') |
|
const imgURL = "https://i.ibb.co/4Nz9wqp/pexels-photo-3117134.jpg" |
|
|
|
let thisDay = new Date() |
|
let thisDayDate = thisDay.getDate() |
|
let thisMonth = thisDay.getMonth() |
|
let thisYear = thisDay.getFullYear() |
|
thisMonthStr = thisMonth < 10 ? '0' + (thisMonth + 1).toString() : (thisMonth + 1).toString() |
|
let firstWkdayOfMonth = ( |
|
new Date(`${thisYear}-${thisMonthStr}-01`).getDay() |
|
) |
|
|
|
//testing only |
|
/* |
|
let thisDay = new Date('2020-02-08') |
|
let firstWkdayOfMonth = 6 |
|
let thisDayDate = 15 |
|
let thisMonth = 7 |
|
let thisYear = 2020 |
|
*/ |
|
|
|
let februaryDays = (leapYear(thisDay.getFullYear())) ? 29 : 28; |
|
|
|
let months = [ |
|
{'name': 'january', 'days': 31}, |
|
{'name': 'february', 'days': februaryDays}, |
|
{'name': 'march', 'days': 31}, |
|
{'name': 'april', 'days': 30}, |
|
{'name': 'may', 'days':31}, |
|
{'name': 'june', 'days':30}, |
|
{'name': 'july', 'days':31}, |
|
{'name': 'august', 'days':31}, |
|
{'name': 'september', 'days':30}, |
|
{'name': 'october', 'days':31}, |
|
{'name': 'november', 'days':30}, |
|
{'name': 'december', 'days':31} |
|
] |
|
|
|
// Choose Sunday first wkdays[0] or Monday first |
|
const weekDays = [ |
|
[0, ['S', 'M', 'T', 'W', 'T', 'F', 'S']], |
|
[1, ['M', 'T', 'W', 'T', 'F', 'S', 'S']] |
|
] |
|
|
|
let wkDayFirst = weekDays[1] |
|
|
|
let mondayOffset = wkDayFirst[0] ? firstWkdayOfMonth - 1 : firstWkdayOfMonth |
|
if (mondayOffset < 0) {mondayOffset = 6} |
|
const spaceMonthYear = months[thisMonth].name.length < 5 ? 50: 10 |
|
let prevMonth = ((thisMonth - 1) < 0) ? 11 : (thisMonth - 1) |
|
let prevMonthTotalDays = months[prevMonth].days |
|
let prevMonthDays = [] |
|
|
|
for (let i = 0; i < mondayOffset; i++) { |
|
prevMonthDays.push(prevMonthTotalDays - i) |
|
} |
|
|
|
let showPrevMdays = prevMonthDays.reverse() |
|
let daysInMonth = months[thisMonth].days |
|
|
|
let widget = new ListWidget() |
|
widget.setPadding(0, 7, 0, 0) |
|
|
|
let imgBG = await getBG(imgURL) |
|
widget.backgroundImage = imgBG |
|
|
|
// widget.backgroundColor = new Color('#ccc',1) |
|
|
|
let monthYearRow = widget.addStack() |
|
monthYearRow.layoutHorizontally() |
|
let monthTxt = monthYearRow.addText(months[thisMonth].name.toUpperCase()) |
|
monthTxt.textColor = monthColor |
|
monthYearRow.addSpacer(spaceMonthYear) |
|
let yearTxt = monthYearRow.addText(thisYear.toString()) |
|
yearTxt.textColor = yearColor |
|
widget.addSpacer(10) |
|
|
|
wkDayRow = widget.addStack() |
|
wkDayRow.layoutHorizontally() |
|
wkDayRow.setPadding(0, 2, 0, 0) |
|
for (let i = 0; i < 7; i++) { |
|
let wkdayTxt = wkDayRow.addText(wkDayFirst[1][i]) |
|
wkdayTxt.font = dayFont |
|
wkdayTxt.textColor = dayColor |
|
wkdayTxt.centerAlignText() |
|
wkDayRow.addSpacer(12) |
|
} |
|
|
|
row1 = widget.addStack() |
|
row2 = widget.addStack() |
|
row3 = widget.addStack() |
|
row4 = widget.addStack() |
|
row5 = widget.addStack() |
|
row6 = widget.addStack() |
|
|
|
let dayOne = 1 |
|
|
|
let strThisMonth = thisMonth.toString() |
|
|
|
for (let i = 0; i < daysInMonth + mondayOffset; i++) { |
|
if (i < mondayOffset) { |
|
addDaysRow(showPrevMdays[i].toString(), dayXColor, row1, prev=true) |
|
dayOne-- |
|
row1.addSpacer(spaceDays) |
|
} |
|
else { |
|
let strDayOne = dayOne.toString() |
|
if (i < 7) { |
|
addDaysRow(strDayOne, dayColor, row1) |
|
row1.addSpacer(spaceDays) |
|
} |
|
else if (i < 14) { |
|
addDaysRow(strDayOne, dayColor, row2) |
|
row2.addSpacer(spaceDays) |
|
} |
|
else if (i < 21) { |
|
addDaysRow(strDayOne, dayColor, row3) |
|
row3.addSpacer(spaceDays) |
|
} |
|
else if (i < 28){ |
|
addDaysRow(strDayOne, dayColor, row4) |
|
row4.addSpacer(spaceDays) |
|
} |
|
else if (i < 28 + 7) { |
|
addDaysRow(strDayOne, dayColor, row5) |
|
row5.addSpacer(spaceDays) |
|
} |
|
else { |
|
addDaysRow(strDayOne, dayColor, row6) |
|
row6.addSpacer(spaceDays) |
|
} |
|
} |
|
dayOne++ |
|
} |
|
|
|
function addDaysRow(dayNum, color, row, prev=false) { |
|
let s = row.addStack() |
|
s.layoutHorizontally() |
|
s.size = new Size(15, 15) |
|
if (dayNum == thisDayDate && !prev) { |
|
const highlightedDate = dayHighlight(dayNum, todayColor, todayHilite) |
|
s.addImage(highlightedDate); |
|
} |
|
else { |
|
let dayShow = s.addText(dayNum) |
|
dayShow.font = dayFont |
|
dayShow.textColor = color |
|
dayShow.centerAlignText() |
|
} |
|
} |
|
|
|
function leapYear(year) { |
|
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); |
|
} |
|
|
|
function dayHighlight (day, todayColor, hilite) { |
|
const drawToday = new DrawContext(); |
|
const size = 35; |
|
drawToday.size = new Size(size, size); |
|
drawToday.opaque = false; |
|
drawToday.setFillColor(hilite); |
|
drawToday.fillEllipse(new Rect(1, 1, size - 2, size - 2)); |
|
drawToday.setFont(new Font('verdana', 24)); |
|
drawToday.setTextAlignedCenter(); |
|
drawToday.setTextColor(todayColor); |
|
drawToday.drawTextInRect(day, new Rect(-1, 1, size, size)); |
|
const currentDayImg = drawToday.getImage(); |
|
return currentDayImg; |
|
} |
|
|
|
async function getBG(url) { |
|
let imgReq = new Request(url) |
|
return await imgReq.loadImage() |
|
} |
|
|
|
Script.setWidget(widget) |
|
Script.complete() |
|
|
|
if (config.runsInWidget) { |
|
widget.presentSmall() |
|
} else { |
|
widget.presentSmall() |
|
} |