UNPKG

@ishubhamx/panchangam-js

Version:

Indian Panchangam (Hindu Calendar) library for calculating Tithi, Nakshatra, Yoga, Karana, and Vara using Swiss Ephemeris

124 lines 6.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateHtmlCalendar = generateHtmlCalendar; const astronomy_engine_1 = require("astronomy-engine"); const panchangam_1 = require("../panchangam"); const luxon_1 = require("luxon"); // Re-using the name arrays from index.ts. In a larger app, we might centralize these. const tithiNames = [ "Prathama", "Dwitiya", "Tritiya", "Chaturthi", "Panchami", "Shashthi", "Saptami", "Ashtami", "Navami", "Dashami", "Ekadashi", "Dwadashi", "Trayodashi", "Chaturdashi", "Purnima", "Prathama", "Dwitiya", "Tritiya", "Chaturthi", "Panchami", "Shashthi", "Saptami", "Ashtami", "Navami", "Dashami", "Ekadashi", "Dwadashi", "Trayodashi", "Chaturdashi", "Amavasya", ]; const nakshatraNames = [ "Ashwini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra", "Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni", "Hasta", "Chitra", "Swati", "Vishakha", "Anuradha", "Jyeshtha", "Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta", "Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati" ]; function formatTime(date, timeZone) { if (!date) return ''; return luxon_1.DateTime.fromJSDate(date).setZone(timeZone).toFormat('HH:mm'); } function generateHtmlCalendar(year, month, observer, timeZone) { const monthDate = luxon_1.DateTime.fromObject({ year, month }); const monthName = monthDate.toFormat('MMMM yyyy'); const daysInMonth = monthDate.daysInMonth; if (!daysInMonth) { return `<html><body>Error: Invalid year or month provided.</body></html>`; } let calendarHtml = ` <html> <head> <title>Panchangam for ${monthName}</title> <style> /* Basic styling for the calendar */ body { font-family: sans-serif; } .calendar { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; border: 1px solid #ccc; } .day, .header { border: 1px solid #ccc; padding: 10px; min-height: 180px; } .header { font-weight: bold; text-align: center; background: #f0f0f0; min-height: auto; } .day-number { font-weight: bold; margin-bottom: 5px; } .details { font-size: 0.8em; } .tithi, .nakshatra, .yoga, .karana, .kala, .timings { margin-bottom: 4px; } .timings { margin-top: 8px; padding-top: 4px; border-top: 1px solid #eee; } .timings div { margin-bottom: 2px; } </style> </head> <body> <h1>Panchangam for ${monthName}</h1> <div class="calendar"> <div class="header">Sun</div> <div class="header">Mon</div> <div class="header">Tue</div> <div class="header">Wed</div> <div class="header">Thu</div> <div class="header">Fri</div> <div class="header">Sat</div> `; // Add empty cells for the first day of the month const firstDayOfMonth = luxon_1.DateTime.fromObject({ year, month, day: 1 }).weekday; // 1 for Monday, 7 for Sunday const startOffset = firstDayOfMonth % 7; for (let i = 0; i < startOffset; i++) { calendarHtml += '<div class="day"></div>'; } for (let day = 1; day <= daysInMonth; day++) { const date = new Date(year, month - 1, day); const sunriseToday = (0, astronomy_engine_1.SearchRiseSet)(astronomy_engine_1.Body.Sun, observer, 1, date, 300); if (sunriseToday === null) { calendarHtml += `<div class="day"><div class="day-number">${day}</div><div>No sunrise</div></div>`; continue; } const nextDate = new Date(date); nextDate.setDate(nextDate.getDate() + 1); const sunriseTomorrow = (0, astronomy_engine_1.SearchRiseSet)(astronomy_engine_1.Body.Sun, observer, 1, nextDate, 300); if (sunriseTomorrow === null) { calendarHtml += `<div class="day"><div class="day-number">${day}</div><div>No sunrise on next day</div></div>`; continue; } const dayWindow = { start: sunriseToday, end: sunriseTomorrow }; const p1 = (0, panchangam_1.getPanchangam)(dayWindow.start.date, observer); let tithiHtml = `${tithiNames[p1.tithi]} (starts ${formatTime(p1.tithiStartTime, timeZone)})`; if (p1.tithiEndTime && p1.tithiEndTime < dayWindow.end.date) { const nextTithiIndex = (p1.tithi + 1) % 30; tithiHtml += `<br>${tithiNames[nextTithiIndex]} (starts ${formatTime(p1.tithiEndTime, timeZone)})`; } let nakshatraHtml = `${nakshatraNames[p1.nakshatra]} (starts ${formatTime(p1.nakshatraStartTime, timeZone)})`; if (p1.nakshatraEndTime && p1.nakshatraEndTime < dayWindow.end.date) { const nextNakshatraIndex = (p1.nakshatra + 1) % 27; nakshatraHtml += `<br>${nakshatraNames[nextNakshatraIndex]} (starts ${formatTime(p1.nakshatraEndTime, timeZone)})`; } let yogaHtml = `${panchangam_1.yogaNames[p1.yoga]} (until ${formatTime(p1.yogaEndTime, timeZone)})`; if (p1.yogaEndTime && p1.yogaEndTime < dayWindow.end.date) { const nextYogaIndex = (p1.yoga + 1) % 27; yogaHtml += `<br>${panchangam_1.yogaNames[nextYogaIndex]} (starts ${formatTime(p1.yogaEndTime, timeZone)})`; } calendarHtml += ` <div class="day"> <div class="day-number">${day}</div> <div class="details"> <div class="tithi">${tithiHtml}</div> <div class="nakshatra">${nakshatraHtml}</div> <div class="yoga"><strong>Yoga:</strong> ${yogaHtml}</div> <div class="karana"><strong>Karana:</strong> ${p1.karana}</div> <div class="kala"><strong>Rahu Kalam:</strong> ${formatTime(p1.rahuKalamStart, timeZone)} - ${formatTime(p1.rahuKalamEnd, timeZone)}</div> <div class="timings"> <div><strong>Sun:</strong> ${formatTime(p1.sunrise, timeZone)} - ${formatTime(p1.sunset, timeZone)}</div> <div><strong>Moon:</strong> ${formatTime(p1.moonrise, timeZone)} - ${formatTime(p1.moonset, timeZone)}</div> </div> </div> </div> `; } calendarHtml += ` </div> </body> </html> `; return calendarHtml; } //# sourceMappingURL=generator.js.map