From cb7626634db682ad9368663d2e10f4199c3f068d Mon Sep 17 00:00:00 2001 From: Hyperling Date: Thu, 30 Jul 2026 10:41:36 -0700 Subject: [PATCH] Add project's current state, started early today (20260730). --- .gitignore | 112 ++++++++++++++++++++++++++++++++++++++ moonth-generator.js | 111 +++++++++++++++++++++++++++++++++++++ package.json | 5 ++ run.sh | 41 ++++++++++++++ templates/DESCRIPTION.txt | 18 ++++++ templates/TITLE.txt | 1 + 6 files changed, 288 insertions(+) create mode 100644 .gitignore create mode 100755 moonth-generator.js create mode 100644 package.json create mode 100755 run.sh create mode 100644 templates/DESCRIPTION.txt create mode 100644 templates/TITLE.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc56b76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,112 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +## Above is Github's recommendations for Node.js. Below are my additions. ## +package-lock.json +files/* + +# Generated ICS Files +*.ics + diff --git a/moonth-generator.js b/moonth-generator.js new file mode 100755 index 0000000..0e453a1 --- /dev/null +++ b/moonth-generator.js @@ -0,0 +1,111 @@ +#!/usr/bin/env nodejs +'use strict'; + +// 20260730 - Hyperling +// Generate .ics files with entries to be imported in a shared calendar. + +/*** Parameters ***/ + +const args = process.argv; + +const cmdExec = args[0]; +const cmdPath = args[1]; +const startDate = args[2]; +const endDate = args[3]; +const DEBUG = args[4]; + +console.log(`Running ${cmdPath} with ${cmdExec}...`); +console.log("Start Date: " + startDate); +console.log(" End Date: " + endDate); + +console.log("Converting strings to dates..."); +const dayStart = new Date(startDate); +const dayEnd = new Date(endDate); +console.log("...done!"); + +/*** Setup ***/ + +// Local Vars + +const name = "Hyperling's Moonth Calendar"; +const domain = "cloud.hyperling.com"; + +// iCalendar Library + +// https://www.npmjs.com/package/ical-generator +import ical, { ICalCalendarMethod } from 'ical-generator'; +const cal = + ical({ + domain: "$domain", + name: "$name" + }) +; + +// File System Reading + +import fs from "fs"; +function readFile (file) { + try { + const text = fs.readFileSync(file, "utf8"); + console.log(file + " loaded!"); + return text; + } catch (e) { + console.error("ERROR: Could not read " + file + ": ", e); + } +} +function writeFile (name, text) { + try { + fs.writeFileSync(name, text); + console.log(name + " written successfully"); + } catch (e) { + console.error("Error writing " + name + ": ", e); + } +} + +const templateTitle = readFile("templates/TITLE.txt") +const templateDesc = readFile("templates/DESCRIPTION.txt"); + +/*** Main ***/ + +const dayOne = new Date("2026-04-01"); +const dayLength = 1000 * 60 * 60 * 24; +function getNumDaysBetween (date1, date2) { + return Math.abs((date1-date2)/dayLength); +} + +for ( + let dayCurr = dayStart; + dayCurr <= dayEnd; + dayCurr.setDate(dayCurr.getDate() + 1) +) { + + if (DEBUG) console.log("DEBUG: curr-Apr1 = ", getNumDaysBetween(dayCurr, dayOne)); + + // Pull data for UID. + const year = dayCurr.getFullYear(); + const moonth = dayCurr.getMonth(); + const day = dayCurr.getDate(); + const extra = "00"; + + // Reset vars to defaults. + const title = templateTitle + .replaceAll("{{MOONTH}}", moonth) + .replaceAll("{{DAY}}", day) + .replaceAll("{{YEAR}}", year) + ; + const description = templateDesc; + + cal.createEvent({ + uid: `${year}${moonth}${day}${extra}@${domain}`, + start: new Date(dayCurr), + allDay: true, + summary: title, + description: description, + }); +} + +/*** Finish ***/ + +// Create Events +//cal.save('schedule.ics'); +writeFile("calendar.ics", cal.toString()); diff --git a/package.json b/package.json new file mode 100644 index 0000000..cb7199a --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ical-generator": "^11.1.0" + } +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..76ade39 --- /dev/null +++ b/run.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# 20260730 - Hyperling +# Generate .ics files for a shared Moonthly calendar hosted on cloud.hyperling.com. + +export DEBUG=true + +echo "`date` - Running $0" + +## Parameters + +# start date +# end date +# number of moonths +# year + +## Install Pre-Reqs ## + +npm="`which npm`" +if [[ ! -s "$npm" ]]; then + echo "ERROR: npm does not seem to be available. Please ensure it is installed" + echo "Aborting." + exit 1 +fi + +echo -e "\n`date` - Dependencies | Installing..." +$npm install +echo -e "\n`date` - Dependencies | Done!\n" + +## Main ## + +# TBD: Remove hardcoded test dates. +start_date="2026-07-30" +end_date="2026-08-10" + +echo -e "\n`date` - Main | Running...\n" +./moonth-generator.js "$start_date" "$end_date" "$DEBUG" +echo -e "\n`date` - Main | Done!\n" + +## Finish ## + +exit 0 diff --git a/templates/DESCRIPTION.txt b/templates/DESCRIPTION.txt new file mode 100644 index 0000000..36db015 --- /dev/null +++ b/templates/DESCRIPTION.txt @@ -0,0 +1,18 @@ +This calendar is generated and maintained by Chad Michael 'Hyperling' Greenwood. + +Feel free to contact me with any questions or concerns. +https://blog.hyperling.com/contact + +Calendar Homepage: +https://blog.hyperling.com/moonth-calendar + +Calendar Subscription: +https://cloud.hyperling.com/remote.php/dav/public-calendars/Rt7jboeJx5awHDyq?export + +Moonth iCal Generator Code: +https://git.hyperling.com/me/nodejs-moonth-generator + +Donations: +https://hyperling.com/donate + +Last Updated {{GEN_DATE}} diff --git a/templates/TITLE.txt b/templates/TITLE.txt new file mode 100644 index 0000000..05157fa --- /dev/null +++ b/templates/TITLE.txt @@ -0,0 +1 @@ +Moonth {{MOONTH}}/13, Day {{DAY}}, {{YEAR}}