From 1271d28720d84a1321fd9bca8ecd0aa16ea4eb51 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 17:34:03 +0200 Subject: [PATCH 01/20] feat: use sfo as tz --- apps/a_clock_timer/app.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index 5f9a3a468..8d078ffe9 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -102,20 +102,19 @@ function queueNextDraw() { function draw() { g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - + var x_sun = 176 - (getGmt().getHours() / 24 * 176 + 4); g.setColor('#ff0').drawLine(x_sun, g.getHeight()-IMAGEHEIGHT, x_sun, g.getHeight()); g.reset(); var locale = require("locale"); - + var date = new Date(); g.setFontAlign(0,0); g.setFont("Michroma36").drawString(locale.time(date,1), g.getWidth()/2, 46); g.setFont("6x8"); g.drawString(locale.date(new Date(),1), 125, 68); - g.drawString("PAR "+locale.time(getTimeFromTimezone(1),1), 125, 80); - g.drawString("TYO "+locale.time(getTimeFromTimezone(9),1), 125, 88); + g.drawString("SFO "+locale.time(getTimeFromTimezone(-8),1), 125, 80); queueNextDraw(); } From 9b59933044083442048d50d302982497beba91a5 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:14:30 +0200 Subject: [PATCH 02/20] feat: new app! --- apps/hebrew_calendar/ChangeLog | 1 + apps/hebrew_calendar/LICENSE | 21 ++ apps/hebrew_calendar/README.md | 25 ++ apps/hebrew_calendar/add_to_apps.json | 15 + apps/hebrew_calendar/app-icon.js | 1 + apps/hebrew_calendar/app.js | 390 ++++++++++++++++++++++++++ apps/hebrew_calendar/app.png | Bin 0 -> 1620 bytes 7 files changed, 453 insertions(+) create mode 100644 apps/hebrew_calendar/ChangeLog create mode 100644 apps/hebrew_calendar/LICENSE create mode 100644 apps/hebrew_calendar/README.md create mode 100644 apps/hebrew_calendar/add_to_apps.json create mode 100644 apps/hebrew_calendar/app-icon.js create mode 100644 apps/hebrew_calendar/app.js create mode 100644 apps/hebrew_calendar/app.png diff --git a/apps/hebrew_calendar/ChangeLog b/apps/hebrew_calendar/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/hebrew_calendar/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/hebrew_calendar/LICENSE b/apps/hebrew_calendar/LICENSE new file mode 100644 index 000000000..cd6624ad4 --- /dev/null +++ b/apps/hebrew_calendar/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-20 Ionică Bizău (https://ionicabizau.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/apps/hebrew_calendar/README.md b/apps/hebrew_calendar/README.md new file mode 100644 index 000000000..8fa6a6535 --- /dev/null +++ b/apps/hebrew_calendar/README.md @@ -0,0 +1,25 @@ +# Hebrew Calendar + +Displays the current hebrew calendar date +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Open the app, and it shows a menu with the date components + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Michael Salaverry +with help from https://github.com/IonicaBizau/hebrew-date (MIT license) diff --git a/apps/hebrew_calendar/add_to_apps.json b/apps/hebrew_calendar/add_to_apps.json new file mode 100644 index 000000000..5eae04cd4 --- /dev/null +++ b/apps/hebrew_calendar/add_to_apps.json @@ -0,0 +1,15 @@ +// Create an entry in apps.json as follows: +{ "id": "7chname", + "name": "Hebrew Calendar", + "shortName":"HebCal", + "version":"0.01", + "description": "lists the date according to the hebrew calendar", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"7chname.app.js","url":"app.js"}, + {"name":"7chname.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/hebrew_calendar/app-icon.js b/apps/hebrew_calendar/app-icon.js new file mode 100644 index 000000000..49232b838 --- /dev/null +++ b/apps/hebrew_calendar/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")) diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js new file mode 100644 index 000000000..eac641c5d --- /dev/null +++ b/apps/hebrew_calendar/app.js @@ -0,0 +1,390 @@ +g.clear(); + +/*! + * This script was taked from this page and ported to Node.js by Ionic Bizu + * http://www.shamash.org/help/javadate.shtml + * + * This script was adapted from C sources written by + * Scott E. Lee, which contain the following copyright notice: + * + * Copyright 1993-1995, Scott E. Lee, all rights reserved. + * Permission granted to use, copy, modify, distribute and sell so long as + * the above copyright and this permission statement are retained in all + * copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK. + * + * Bill Hastings + * RBI Software Systems + * bhastings@rbi.com + */ + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var GREG_SDN_OFFSET = 32045, + DAYS_PER_5_MONTHS = 153, + DAYS_PER_4_YEARS = 1461, + DAYS_PER_400_YEARS = 146097; + +var HALAKIM_PER_HOUR = 1080, + HALAKIM_PER_DAY = 25920, + HALAKIM_PER_LUNAR_CYCLE = 29 * HALAKIM_PER_DAY + 13753, + HALAKIM_PER_METONIC_CYCLE = HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7); + +var HEB_SDN_OFFSET = 347997, + NEW_MOON_OF_CREATION = 31524, + NOON = 18 * HALAKIM_PER_HOUR, + AM3_11_20 = 9 * HALAKIM_PER_HOUR + 204, + AM9_32_43 = 15 * HALAKIM_PER_HOUR + 589; + +var SUN = 0, + MON = 1, + TUES = 2, + WED = 3, + THUR = 4, + FRI = 5, + SAT = 6; + +function weekdayarr(d0, d1, d2, d3, d4, d5, d6) { + this[0] = d0; + this[1] = d1; + this[2] = d2; + this[3] = d3; + this[4] = d4; + this[5] = d5; + this[6] = d6; +} + +function gregmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; +} + +function hebrewmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; + this[12] = m12; + this[13] = m13; +} + +function monthsperyeararr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; + this[12] = m12; + this[13] = m13; + this[14] = m14; + this[15] = m15; + this[16] = m16; + this[17] = m17; + this[18] = m18; +} + +var gWeekday = new weekdayarr("Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"), + gMonth = new gregmontharr("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), + hMonth = new hebrewmontharr("Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "AdarI", "AdarII", "Nisan", "Iyyar", "Sivan", "Tammuz", "Av", "Elul"), + mpy = new monthsperyeararr(12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 13); + +/** + * hebrewDate + * Convert the Gregorian dates into Hebrew calendar dates. + * + * @name hebrewDate + * @function + * @param {Date|Number} inputDate The date object (representing the Gregorian date) or the year. + * @param {Number?} inputMonth The Gregorian month (**one-indexed**, January being `1`!). + * @param {Number?} inputDate The Gregorian date. + * @return {Object} An object containing: + * + * - `year`: The Hebrew year. + * - `month`: The Hebrew month. + * - `month_name`: The Hebrew month name. + * - `date`: The Hebrew date. + */ +const hebrewDate = function (inputDateOrYear, inputMonth, inputDate) { + + var hebrewMonth = 0, + hebrewDate = 0, + hebrewYear = 0, + metonicCycle = 0, + metonicYear = 0, + moladDay = 0, + moladHalakim = 0; + + function GregorianToSdn(inputYear, inputMonth, inputDay) { + + var year = 0, + month = 0, + sdn = void 0; + + // Make year a positive number + if (inputYear < 0) { + year = inputYear + 4801; + } else { + year = inputYear + 4800; + } + + // Adjust the start of the year + if (inputMonth > 2) { + month = inputMonth - 3; + } else { + month = inputMonth + 9; + year--; + } + + sdn = Math.floor(Math.floor(year / 100) * DAYS_PER_400_YEARS / 4); + sdn += Math.floor(year % 100 * DAYS_PER_4_YEARS / 4); + sdn += Math.floor((month * DAYS_PER_5_MONTHS + 2) / 5); + sdn += inputDay - GREG_SDN_OFFSET; + + return sdn; + } + + function SdnToHebrew(sdn) { + var tishri1 = 0, + tishri1After = 0, + yearLength = 0, + inputDay = sdn - HEB_SDN_OFFSET; + + FindTishriMolad(inputDay); + tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); + + if (inputDay >= tishri1) { + // It found Tishri 1 at the start of the year. + hebrewYear = metonicCycle * 19 + metonicYear + 1; + if (inputDay < tishri1 + 59) { + if (inputDay < tishri1 + 30) { + hebrewMonth = 1; + hebrewDate = inputDay - tishri1 + 1; + } else { + hebrewMonth = 2; + hebrewDate = inputDay - tishri1 - 29; + } + return; + } + // We need the length of the year to figure this out,so find Tishri 1 of the next year. + moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + tishri1After = Tishri1((metonicYear + 1) % 19, moladDay, moladHalakim); + } else { + // It found Tishri 1 at the end of the year. + hebrewYear = metonicCycle * 19 + metonicYear; + if (inputDay >= tishri1 - 177) { + // It is one of the last 6 months of the year. + if (inputDay > tishri1 - 30) { + hebrewMonth = 13; + hebrewDate = inputDay - tishri1 + 30; + } else if (inputDay > tishri1 - 60) { + hebrewMonth = 12; + hebrewDate = inputDay - tishri1 + 60; + } else if (inputDay > tishri1 - 89) { + hebrewMonth = 11; + hebrewDate = inputDay - tishri1 + 89; + } else if (inputDay > tishri1 - 119) { + hebrewMonth = 10; + hebrewDate = inputDay - tishri1 + 119; + } else if (inputDay > tishri1 - 148) { + hebrewMonth = 9; + hebrewDate = inputDay - tishri1 + 148; + } else { + hebrewMonth = 8; + hebrewDate = inputDay - tishri1 + 178; + } + return; + } else { + if (mpy[(hebrewYear - 1) % 19] == 13) { + hebrewMonth = 7; + hebrewDate = inputDay - tishri1 + 207; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + } else { + hebrewMonth = 6; + hebrewDate = inputDay - tishri1 + 207; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + } + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 29; + if (hebrewDate > 0) return; + // We need the length of the year to figure this out,so find Tishri 1 of this year. + tishri1After = tishri1; + FindTishriMolad(moladDay - 365); + tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); + } + } + yearLength = tishri1After - tishri1; + moladDay = inputDay - tishri1 - 29; + if (yearLength == 355 || yearLength == 385) { + // Heshvan has 30 days + if (moladDay <= 30) { + hebrewMonth = 2; + hebrewDate = moladDay; + return; + } + moladDay -= 30; + } else { + // Heshvan has 29 days + if (moladDay <= 29) { + hebrewMonth = 2; + hebrewDate = moladDay; + return; + } + moladDay -= 29; + } + // It has to be Kislev. + hebrewMonth = 3; + hebrewDate = moladDay; + } + + function FindTishriMolad(inputDay) { + // Estimate the metonic cycle number. Note that this may be an under + // estimate because there are 6939.6896 days in a metonic cycle not + // 6940,but it will never be an over estimate. The loop below will + // correct for any error in this estimate. + metonicCycle = Math.floor((inputDay + 310) / 6940); + // Calculate the time of the starting molad for this metonic cycle. + MoladOfMetonicCycle(); + // If the above was an under estimate,increment the cycle number until + // the correct one is found. For modern dates this loop is about 98.6% + // likely to not execute,even once,because the above estimate is + // really quite close. + while (moladDay < inputDay - 6940 + 310) { + metonicCycle++; + moladHalakim += HALAKIM_PER_METONIC_CYCLE; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + } + // Find the molad of Tishri closest to this date. + for (metonicYear = 0; metonicYear < 18; metonicYear++) { + if (moladDay > inputDay - 74) break; + moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + } + } + + function MoladOfMetonicCycle() { + var r1 = void 0, + r2 = void 0, + d1 = void 0, + d2 = void 0; + // Start with the time of the first molad after creation. + r1 = NEW_MOON_OF_CREATION; + // Calculate gMetonicCycle * HALAKIM_PER_METONIC_CYCLE. The upper 32 + // bits of the result will be in r2 and the lower 16 bits will be in r1. + r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF); + r2 = r1 >> 16; + r2 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE >> 16 & 0xFFFF); + // Calculate r2r1 / HALAKIM_PER_DAY. The remainder will be in r1,the + // upper 16 bits of the quotient will be in d2 and the lower 16 bits + // will be in d1. + d2 = Math.floor(r2 / HALAKIM_PER_DAY); + r2 -= d2 * HALAKIM_PER_DAY; + r1 = r2 << 16 | r1 & 0xFFFF; + d1 = Math.floor(r1 / HALAKIM_PER_DAY); + r1 -= d1 * HALAKIM_PER_DAY; + moladDay = d2 << 16 | d1; + moladHalakim = r1; + } + + function Tishri1(metonicYear, moladDay, moladHalakim) { + var tishri1 = moladDay, + dow = tishri1 % 7, + leapYear = metonicYear == 2 || metonicYear == 5 || metonicYear == 7 || metonicYear == 10 || metonicYear == 13 || metonicYear == 16 || metonicYear == 18, + lastWasLeapYear = metonicYear == 3 || metonicYear == 6 || metonicYear == 8 || metonicYear == 11 || metonicYear == 14 || metonicYear == 17 || metonicYear == 0; + + // Apply rules 2,3 and 4 + if (moladHalakim >= NOON || !leapYear && dow == TUES && moladHalakim >= AM3_11_20 || lastWasLeapYear && dow == MON && moladHalakim >= AM9_32_43) { + tishri1++; + dow++; + if (dow == 7) dow = 0; + } + + // Apply rule 1 after the others because it can cause an additional delay of one day. + if (dow == WED || dow == FRI || dow == SUN) { + tishri1++; + } + + return tishri1; + } + + var inputYear = inputDateOrYear; + + if ((typeof inputYear === "undefined" ? "undefined" : _typeof(inputYear)) === "object") { + inputMonth = inputDateOrYear.getMonth() + 1; + inputDate = inputDateOrYear.getDate(); + inputYear = inputDateOrYear.getFullYear(); + } + + SdnToHebrew(GregorianToSdn(inputYear, inputMonth, inputDate)); + + return { + year: hebrewYear, + month: hebrewMonth, + date: hebrewDate, + month_name: hMonth[hebrewMonth - 1] + }; +}; + + +g.setFont("Vector",10); +let now = new Date(); +let today = hebrewDate(now); + +var mainmenu = { + "" : { + "title" : "Hebrew Date" + }, + cal: { + value : now.getDay()+"/"+now.getMonth()+"/"+now.getFullYear(), + onchange : () => {} + }, + date: { + value : today.date, + onchange : () => {} + }, + month: { + value : today.month_name, + onchange : () => {} + }, + year: { + value : today.year, + onchange : () => {} + }, + "Exit" : function() { E.showMenu(); }, +}; +E.showMenu(mainmenu); diff --git a/apps/hebrew_calendar/app.png b/apps/hebrew_calendar/app.png new file mode 100644 index 0000000000000000000000000000000000000000..582cb2e0853a5a2899a3afbd7eb19cde2ee7f6a0 GIT binary patch literal 1620 zcmV-a2CMmrP)1gXjloC|3_d8m;N2OpV(|i0q4YwBna<2! zK9thw%-*|urnNbV{Gax^?eD+#{x0kLJ~)lj_;W+1>qV*k8akT^^dvctZccUyj4}H~#M%Wwee_v` zHMv7o%BM8@dBrLshn{wGD9BDl?^eV5vSM3T96;NnHvtc6La=(qzq)xrX1d8bK-TN- zrd_f$_O`9nEmS+_S7HTXK<&u;LDIW|qlN&KJvM}tt6TVVqL-AvNv`B*{NzNpBfSQwQP5~Sf(Dp@Vq1+3Q`N9wBQN2`J_?M^u0FIMlt?p^8 z%U3%80kIwg!T{E9<8J18S&$k1`eO)@HP+=TZKo(z3_A3VFYJB=sn`2^Q$mRE>02(+W)np;)L1!GUvU2{O{<&F_nE6Qe#D~Xf|dD z+?d3-D1(IUiL`C2;PPv4CKw8H)v7h8^obJ&Z6D0CjVUe8Xq_NAymxUyPAMU^CCrIu z%1M71EC`5o2if_~7E&h??0jeQ1Y3N6p?}G72FmS*)xQD)%wBE=2tW6@(+MTi!fk9H1pWKew2(jTXVu4%vk26QvSQCbGmk`Z)Y! zBIhh)6vG2)h6mF8wC^|l$M(Eo9D?JiW}=_T2jUA>LC80foTera{^p)Wi`>}Gf;(|ZwEZQ zS^k|*9wyt=f4ZOo!xty7{%}HKD9tBZ50g$=%v&&vMa!#@Nsf>EkEEDA*ST6fiC+An zsNK1#>!x0obq@j$QqYU-ad3ZvbjqUU+%iw(0WahgmHV6yeLWqoYkSl4pzFQ(_Vp&I ztO{WI-48rGLwQb?#vgVvduyd9_6W)rFRoQJq3I(J?{Xmin45#=3l9BmL6Bp<*MZej zrsWN7oRPUr7IvrHoIHOjS=gPTCw>d)^LQK+B|=f2qbGjrWaOd5D<<9Dv>MTW0X3z> zyPy}9`<>1~?NCx@m8G$_@rRTy5zH12YM&P)=tU+L^fgY z^0Z&_6^qdVuwgN3wt_Ze(10?J@%{C2grBk42hsu74qEo^nd&v`X`IHN9lrxzS~GeF S(*#!l0000 Date: Fri, 3 Dec 2021 18:17:18 +0200 Subject: [PATCH 03/20] fix: metadata json --- apps/hebrew_calendar/add_to_apps.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/hebrew_calendar/add_to_apps.json b/apps/hebrew_calendar/add_to_apps.json index 5eae04cd4..49170c6ae 100644 --- a/apps/hebrew_calendar/add_to_apps.json +++ b/apps/hebrew_calendar/add_to_apps.json @@ -1,5 +1,4 @@ -// Create an entry in apps.json as follows: -{ "id": "7chname", +{ "id": "hebrewCalendar", "name": "Hebrew Calendar", "shortName":"HebCal", "version":"0.01", @@ -9,7 +8,7 @@ "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"7chname.app.js","url":"app.js"}, - {"name":"7chname.img","url":"app-icon.js","evaluate":true} + {"name":"hebrewCalendar.app.js","url":"app.js"}, + {"name":"hebrewCalendar.img","url":"app-icon.js","evaluate":true} ] } From e9f2346504ad1332946444cf9b1e9ceb60b9404c Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:19:52 +0200 Subject: [PATCH 04/20] fix: duh --- apps.json | 24 ++++++++++++++++++++++++ apps/hebrew_calendar/add_to_apps.json | 14 -------------- 2 files changed, 24 insertions(+), 14 deletions(-) delete mode 100644 apps/hebrew_calendar/add_to_apps.json diff --git a/apps.json b/apps.json index a312b90a3..5320aaef5 100644 --- a/apps.json +++ b/apps.json @@ -29,6 +29,30 @@ ], "sortorder": -10 }, + { + "id": "hebrewCalendar", + "name": "Hebrew Calendar", + "shortName": "HebCal", + "version": "0.01", + "description": "lists the date according to the hebrew calendar", + "icon": "app.png", + "tags": "", + "supports": [ + "BANGLEJS2" + ], + "readme": "README.md", + "storage": [ + { + "name": "hebrewCalendar.app.js", + "url": "app.js" + }, + { + "name": "hebrewCalendar.img", + "url": "app-icon.js", + "evaluate": true + } + ] + }, { "id": "messages", "name": "Messages", diff --git a/apps/hebrew_calendar/add_to_apps.json b/apps/hebrew_calendar/add_to_apps.json deleted file mode 100644 index 49170c6ae..000000000 --- a/apps/hebrew_calendar/add_to_apps.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "hebrewCalendar", - "name": "Hebrew Calendar", - "shortName":"HebCal", - "version":"0.01", - "description": "lists the date according to the hebrew calendar", - "icon": "app.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"hebrewCalendar.app.js","url":"app.js"}, - {"name":"hebrewCalendar.img","url":"app-icon.js","evaluate":true} - ] -} From 7550dd57eb131883831886f278761b45533a159c Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:25:27 +0200 Subject: [PATCH 05/20] fix: path --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 5320aaef5..e3b067a11 100644 --- a/apps.json +++ b/apps.json @@ -43,11 +43,11 @@ "readme": "README.md", "storage": [ { - "name": "hebrewCalendar.app.js", + "name": "hebrew_calendar.app.js", "url": "app.js" }, { - "name": "hebrewCalendar.img", + "name": "hebrew_calendar.img", "url": "app-icon.js", "evaluate": true } From a41598a2e836c0c385aa449494c78d5cc2cf8c87 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:28:21 +0200 Subject: [PATCH 06/20] fix: --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e3b067a11..992cce5d6 100644 --- a/apps.json +++ b/apps.json @@ -30,7 +30,7 @@ "sortorder": -10 }, { - "id": "hebrewCalendar", + "id": "hebrew_calendar", "name": "Hebrew Calendar", "shortName": "HebCal", "version": "0.01", From 9195e108574c79d38da16e39783a88e29baaca8f Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:33:42 +0200 Subject: [PATCH 07/20] feat: swifty icon --- apps/hebrew_calendar/README.md | 1 + apps/hebrew_calendar/app-icon.js | 2 +- apps/hebrew_calendar/app.png | Bin 1620 -> 32788 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/README.md b/apps/hebrew_calendar/README.md index 8fa6a6535..3141f41b3 100644 --- a/apps/hebrew_calendar/README.md +++ b/apps/hebrew_calendar/README.md @@ -23,3 +23,4 @@ Name who should be contacted for support/update requests Michael Salaverry with help from https://github.com/IonicaBizau/hebrew-date (MIT license) +
Icons made by Smashicons from www.flaticon.com
\ No newline at end of file diff --git a/apps/hebrew_calendar/app-icon.js b/apps/hebrew_calendar/app-icon.js index 49232b838..b6b0a53ae 100644 --- a/apps/hebrew_calendar/app-icon.js +++ b/apps/hebrew_calendar/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")) +require("heatshrink").decompress(atob("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/4ABIn4C/AXWQX/4C/X/6/DghH/AX4C5wC/DgBH/AX4C5Xwi//AX6//gESI/4C/AW8gX4sCI/4C/AW6+FAAMJJX4C/AWtAX48BJX4C/AWq+HAAMEJX4C/AWeAX5MAgRN/AX4CxXpQADn//AH4A/AFn8Xxy//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X/4A/X/6//AH6//X7n7tu/CaH27YnRE3d/EyO3X/4AG/3btu2CZ/t23bt4mS74mRtom1/4mSX+32JQXbCZwRCtu/E34mvX+xcCAQN/CRn7OIe3E34muX+39JSQRDTH4mO2wmSt6//X5JKNX4hxNE34mhX/6Y/E36/29qY/E3NtX/6/W/yY/EyffX/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X7hKMX4xxME34mgX+RZGARBiDLIwCIE34mkX+xcOAQISB/YROtu3EyV/E34mOX+39JSFv/4RPAQIm/E0S/29pKR/xxSE0vfTCNtX6QmUX/4CJTCYm/E0C/3LiACB+xxSE0vbTCW+E0u/X/4C/AXy//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//AX4C/X/4C/AX6//ARX2L6PfTHO+CiXtX/6/wOKX+E3C//ABaY/E34CHTSS//TH6//X+1vOKQmm7/9TCQmmX+xKRt5xSE34miX/6Y/E36/2/5KQv///ZxP24m/E0S//TH4m/X+/2JR4TCOJ+/E34mjX/4CG75xSE0yYC/yYS9omlX+xKPTAZxPE34mkX+3/JRwSD/pxNt4m/E0i/3/ZKM24TEOJt/E34mlX+3/JRm/CQn2OJgm/E0y/39pKLCQv+OJffE34mmX+/9JRVvCYxxLE34moX+3/JRQSH/ZxJ34ml24TH+wmJv4THE0y/2/xKI74TI9pxIE34mqX+3//ZKG24TKOI9/E34mrX+3/9pKFCRf+OIvfE34msX/tvTH4mt/q//X/6//X/6//X/6//X/6//X/6//X/6//TH4m/X/5xw/qYrt6//X/6//X/6/9/6//X/6//X/6/TOkC//X8m/X7wREX/6//X/6/nExi/3TAy//X/6//X7//X8n7X4t/X/6//X7G3X/6//X9XbX/4AF+y//X/6/LQxa/SHAy//X/6/TQyK/ZHDy//X8H7X/44R26//X72/X8ytKX6IRGX8ImFX/6/fv4TLVrARcAARfFX/6//TY/bVrf2X/6/yL4y//X+ZfMX/5fgX4wUJX6JKF2xf1X/6/mt6/Z/q//X/5fOVRK/s242MCgy//X750NX6f7CgttX7PtX85KGX/6/1RJC/QEAy//X/4AC9oUFFBq/nVRhKUX/4AM+y/uFJC/PSoy/pSbK//X6gUG2y/XBwo1WX/6/fSpB0L34UM/q/GWA6/OBw3bt5eNaiYpGX/6/ZVQy/VO46/OI4y/VChq//X+v/X49/X6gdOX/6/oQwy/T26/VRgy/N9q/V/a/ZfA6//Jqa/U+yhGtu/HCQaGAQIzNX4zUMOKi//X8QpGC444MU4yVQX/6/82wqOX44sFHBbaIGSy//X9/2X7vbHB4vGGTBxhX/BiUR4xiO/a/It6GN/oXHtu3GJojGLiiSaX/6/W/6/Itu/X5gXMX/6//O7AAB9qnIWwS/IFg4CDGByqGcYa//X/4AD/q/J7d/X5AUKt6//X+X7R4zUTChoABVRQCUF6wUT26//X+f2X7xbPX/6//t4rO/y/d74uO/q//X8f/VSbUGX57XHASwtPX4yqNCg2/X/6/jtorPC44CUU5oAC9q//X/AUGX6AXHASiSQX4wXNX/6SXCihlQPowCTt5ZXIhrUUX/ZQGCihlRX7N/X65uiX/5lX24tQ+y/YFSH7X/6/s34UM/qVGFyK/XFLFvCprUUX/aqGX86AHARw+NX8AUOX/6ARTA3fF7ACOE6P+DQ1/Cpn7X/6PX26/U7YwSX6akNAAn2X/6/mR4y/OPo4wTX6IlTIKq/Gd6S/+QZx9HNCi/P35WaX5xWbX/4AL/xoGt4ybRjf9Do3fX6iQcX932NDdtGaq/LEKvtDqn+X/6//AA/9X49/ECy//X9JTGX537X42/GtgAJHw23Gtq/67aAkRM7+W+y//X+G2X+pTGX/6/jNY9/CpvtX4xrWX7odGAQIXOKYyPdX/4AF/prG7a/z+w7Gt6//X8f7Nai/Ia5y/kHY5TV26//X8aDXX8b7XX/4AWNYttCp32QYwXPX8XtX44XV36//X8ihGNyy/cHAwdQX/4AWKyq/I26/v/a/XC4yOeX/4AHX4+2X944YX/6/d24WO/aGHUia/aDQxQZX/4AP/puV/6/H7a/t+y/H34YOC41vX/6/W2wXP9q/Hv6/sGo9tDB6//ADBxGRh6/IOKS/Z/q/XGQ3bv6//X86JJ36/qGQz1RX/4AZ+xZGa6wCB26/p/a/IU55lXX/6MILKBxHAQK/pGRBNXGSK//X5F/C6yMSX67yJDSAXXX/4ACOg1vC6zaZUi4CCDJ/9C6y//X7f7X5FtX8vtF5G3X/6/rU44YQX5O/X8gvYbRDXQX/6/LOi4CDX8YsIAQJjQC4y//ACq/X/q/J7a/h+wsJt5ioX/5cL24YQX5SSMX6bsLv5IP/a//ADntO4wYQU4x6QX6YpJC5oAEDQ6LhX+f9O8DdOX6QpWF5nbt6//X9/7SpXbX7f2X5W3X/6/v/6hRAA6/LPpK/Q/omKtu/IqDdHv6//ACxfZTBm3X6/7cyoAIDQ6KiX/56XQBi/OHw5EX/q//AD6PG7dvbTICGX6ftcai/Sd46//ACKeNDSiDLX5b7HAQ5CScA6JjX/u/DSP7TxrjEX5SbHAQ+3LqTaaX/6kOPqahPAQN/X5AaQboZcrX/4AHQA4aS/qkRATNvICQdH36//X+v/+y/qH6a//AEftQA3fQDYChHqf+Do6IkX+39QY4cT/a/n249T+wdGt6//ADiDHv4cT9q/mLOK//MqFvDrgCdUKn9X/6/l+yGHDqn+X8ffHSntEA6HlX+6hI34eU/a/h25YVbrq//ABKGe/q/ft43VfBCGmX/Bof+y/eGywgH26//X9HfED4CTTy/+X/6/o/6MIEC/tX7QzX+wgH36//AECeIv6MgASBUYcEC//ABP9NY9vEbK/V35T8X/4AIR5Aja+y/SFzXtEY9/X/4AiTZG/Era/PFkqEoX/X+SQ+3E7q/LFLv7Ew/fX/4AkSpBufdIwmmc0C//X6HbX/4AF+y//X937X5F/X/4AEJo9t26//AEy/It6//AAf9X5G/X/4Am9pxmX8pKGAQSCqX/n/OJG3X/4AB/a/It6//AFH2X4+2X/4ABJRHbv6//X+XbX/5KJczq//ABq/Jv6/+I44CBQFi/+/a/It6/9/q/I26//AFi/Itu/X/hHkX/4AS9p3I26/7/a/JP9q///p3ITzS/gEAwCDt6//H9v/X5Pbv6/4Ika//AC32PRNvX+/9X5R+uX/4ABPRNt36/2IJO2Pt6//AAP7PsK/eHxACB26//X+P/X5XbX+YdGAQm/X/6/y9q/Kv6/yHxVtPmC//QEi/cf0K//AD/2X5W3X9/7HZICBPeK//AAi/KQai/aDQzgaX/4Ai/a/Lt6/r/o4Ktu3PWS//AAq/Ltu/X9Q4eX/4An/qGL2y/pGpfbt55zX/4AGX5nbv6/mGrq//AFahGAQ+/X8gyMbqK//AFi/N2y/jGTi//AGCMN7d/X8AvNtu/X/6/+/qPO26/d/bvOt522X/4AJX5wCBX7f2Fh9/X/6//Ug4CK26/X/YpPbRa//JO6VS7d/X6gmQdJK//X/f/9qYRWYq/LBYwCNOfK//ABi/SAQS/LECnbv6//X/4AGU4wCva4S//X/4AG/a/z25x7X/4AO9q/yOHi//AB6/xv6//X/4AM/y/v75v9X/4ARX9u/Nvy//ACS/rt5s/X/4AS/y/p75r/X/4AVX8+/NH6//AC6/lv5m/X/4AZX8Zj/X/4Ac/q/gMP6//AD3+X7vfL/6//AEP9X7Rb/X/4AlX65X/X/4Ap+y/SKf6//AFy8Nv5O/X/4Az/y8F75H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/6//I/6//X/5H/X/4Al+ytFAUhr/X/4ASXlICD36//X/4AO/y8rAQffX/6//ABq8tAQd/X/6//ABftX+NtX/6//ABX7XmACC26//X/4AJXmICDX/6//ABH2X+vbX/6//AA680AQV/X/6//AAv9X+9vX/6//AAvtX+9tX/6//AAq82AQW/X/6//AAf7X/O3X/6//AAa83AQa//X/6//X/6//AAX+X/ffX/6//AAP2X/fbX/6//X/6//X/4ABXnQCCv6//X/6//X/6///q/9t6//X/6//X/6//9q/9tq//X/6//X/6//X/6//X/688AQW/X/6//X/6//X/6//X/6//X/6//X/6//X/6/9/a//X/6//X/+3X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/6//X/v/X/+/X/6//X/6//X/3tX/x22X/4AI/q/9t6//X///X/t/X/6////2X/h13X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6//AH4A/X/4A/AH6/Qg5R/AH4At8C//AH6//X/4A/X/6/PgBR/AH4AtXyC//AH6//X/4A/X/8Aj5S/AH4Ar/C/RgZT/AH4Ar4C//AH6//X6MAv5U/AH4Ap/y+SgEPKv4A/AFPwX6cBKv4A/AFOAX/4A/X/6/TgEHK34A/AE/gXygABK/4A/AE6+WgEfLH4A/AEv4X68Av5a/AH4Aj/y+YgEBLf4A/AEeAX7MAg5c/AH4Ah8C+aAAV/L/4A/ADv+V54")) \ No newline at end of file diff --git a/apps/hebrew_calendar/app.png b/apps/hebrew_calendar/app.png index 582cb2e0853a5a2899a3afbd7eb19cde2ee7f6a0..0dae731cddda69ecfca2d3de516546061c63103d 100644 GIT binary patch literal 32788 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

J`x+vYx@wLq< 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 literal 1620 zcmV-a2CMmrP)1gXjloC|3_d8m;N2OpV(|i0q4YwBna<2! zK9thw%-*|urnNbV{Gax^?eD+#{x0kLJ~)lj_;W+1>qV*k8akT^^dvctZccUyj4}H~#M%Wwee_v` zHMv7o%BM8@dBrLshn{wGD9BDl?^eV5vSM3T96;NnHvtc6La=(qzq)xrX1d8bK-TN- zrd_f$_O`9nEmS+_S7HTXK<&u;LDIW|qlN&KJvM}tt6TVVqL-AvNv`B*{NzNpBfSQwQP5~Sf(Dp@Vq1+3Q`N9wBQN2`J_?M^u0FIMlt?p^8 z%U3%80kIwg!T{E9<8J18S&$k1`eO)@HP+=TZKo(z3_A3VFYJB=sn`2^Q$mRE>02(+W)np;)L1!GUvU2{O{<&F_nE6Qe#D~Xf|dD z+?d3-D1(IUiL`C2;PPv4CKw8H)v7h8^obJ&Z6D0CjVUe8Xq_NAymxUyPAMU^CCrIu z%1M71EC`5o2if_~7E&h??0jeQ1Y3N6p?}G72FmS*)xQD)%wBE=2tW6@(+MTi!fk9H1pWKew2(jTXVu4%vk26QvSQCbGmk`Z)Y! zBIhh)6vG2)h6mF8wC^|l$M(Eo9D?JiW}=_T2jUA>LC80foTera{^p)Wi`>}Gf;(|ZwEZQ zS^k|*9wyt=f4ZOo!xty7{%}HKD9tBZ50g$=%v&&vMa!#@Nsf>EkEEDA*ST6fiC+An zsNK1#>!x0obq@j$QqYU-ad3ZvbjqUU+%iw(0WahgmHV6yeLWqoYkSl4pzFQ(_Vp&I ztO{WI-48rGLwQb?#vgVvduyd9_6W)rFRoQJq3I(J?{Xmin45#=3l9BmL6Bp<*MZej zrsWN7oRPUr7IvrHoIHOjS=gPTCw>d)^LQK+B|=f2qbGjrWaOd5D<<9Dv>MTW0X3z> zyPy}9`<>1~?NCx@m8G$_@rRTy5zH12YM&P)=tU+L^fgY z^0Z&_6^qdVuwgN3wt_Ze(10?J@%{C2grBk42hsu74qEo^nd&v`X`IHN9lrxzS~GeF S(*#!l0000 Date: Fri, 3 Dec 2021 18:35:57 +0200 Subject: [PATCH 08/20] docs: --- apps/hebrew_calendar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/README.md b/apps/hebrew_calendar/README.md index 3141f41b3..3702cab57 100644 --- a/apps/hebrew_calendar/README.md +++ b/apps/hebrew_calendar/README.md @@ -9,7 +9,7 @@ Open the app, and it shows a menu with the date components ## Features -Name the function +Shows the hebrew date, month, and year; alongside the gregorian date ## Controls From 7e833088f896e60402c22549fde1c4f885b94db8 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:38:15 +0200 Subject: [PATCH 09/20] fix: displayed day of week, not date fix: wrong month --- apps/hebrew_calendar/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index eac641c5d..ccf21ddde 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -370,7 +370,7 @@ var mainmenu = { "title" : "Hebrew Date" }, cal: { - value : now.getDay()+"/"+now.getMonth()+"/"+now.getFullYear(), + value: now.getDate() + "/" + Number(now.getMonth() + 1) + "/" + now.getFullYear(), onchange : () => {} }, date: { From 0a25e50e50f67ec4b60ffa111e67461f3150fc5f Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:39:06 +0200 Subject: [PATCH 10/20] docs: --- apps/hebrew_calendar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/README.md b/apps/hebrew_calendar/README.md index 3702cab57..5b6feff91 100644 --- a/apps/hebrew_calendar/README.md +++ b/apps/hebrew_calendar/README.md @@ -23,4 +23,4 @@ Name who should be contacted for support/update requests Michael Salaverry with help from https://github.com/IonicaBizau/hebrew-date (MIT license) -

Icons made by Smashicons from www.flaticon.com
\ No newline at end of file + \ No newline at end of file From d8c6d55e65da9d620d5eaec9c6ac7f4b3db9285d Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:39:22 +0200 Subject: [PATCH 11/20] docs: --- apps/hebrew_calendar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/README.md b/apps/hebrew_calendar/README.md index 5b6feff91..7a96a97db 100644 --- a/apps/hebrew_calendar/README.md +++ b/apps/hebrew_calendar/README.md @@ -17,7 +17,7 @@ Name the buttons and what they are used for ## Requests -Name who should be contacted for support/update requests +Michael Salaverry (github.com/barakplasma) ## Creator From 255a75d847a243fc5bcb0c225262843b051a82b1 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 18:40:10 +0200 Subject: [PATCH 12/20] fix: remove no-op exit --- apps/hebrew_calendar/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index ccf21ddde..02b056af0 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -384,7 +384,6 @@ var mainmenu = { year: { value : today.year, onchange : () => {} - }, - "Exit" : function() { E.showMenu(); }, + } }; E.showMenu(mainmenu); From 643728af7800681daebae5f12f1e5bfd9a0037d6 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Fri, 3 Dec 2021 19:07:56 +0200 Subject: [PATCH 13/20] feat: use locale lib --- apps/hebrew_calendar/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index 02b056af0..5bed9c590 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -370,7 +370,7 @@ var mainmenu = { "title" : "Hebrew Date" }, cal: { - value: now.getDate() + "/" + Number(now.getMonth() + 1) + "/" + now.getFullYear(), + value: require('locale').date(now,1), onchange : () => {} }, date: { From ea8c1688dbf2c0b995e5ff6fb456ea910e0843cb Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 10:49:50 +0200 Subject: [PATCH 14/20] refactor: extract lib --- apps/hebrew_calendar/app.js | 364 +---------------------------- apps/hebrew_calendar/hebrewDate.js | 359 ++++++++++++++++++++++++++++ 2 files changed, 360 insertions(+), 363 deletions(-) create mode 100644 apps/hebrew_calendar/hebrewDate.js diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index 5bed9c590..074c22988 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -1,369 +1,7 @@ g.clear(); -/*! - * This script was taked from this page and ported to Node.js by Ionic Bizu - * http://www.shamash.org/help/javadate.shtml - * - * This script was adapted from C sources written by - * Scott E. Lee, which contain the following copyright notice: - * - * Copyright 1993-1995, Scott E. Lee, all rights reserved. - * Permission granted to use, copy, modify, distribute and sell so long as - * the above copyright and this permission statement are retained in all - * copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK. - * - * Bill Hastings - * RBI Software Systems - * bhastings@rbi.com - */ - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var GREG_SDN_OFFSET = 32045, - DAYS_PER_5_MONTHS = 153, - DAYS_PER_4_YEARS = 1461, - DAYS_PER_400_YEARS = 146097; - -var HALAKIM_PER_HOUR = 1080, - HALAKIM_PER_DAY = 25920, - HALAKIM_PER_LUNAR_CYCLE = 29 * HALAKIM_PER_DAY + 13753, - HALAKIM_PER_METONIC_CYCLE = HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7); - -var HEB_SDN_OFFSET = 347997, - NEW_MOON_OF_CREATION = 31524, - NOON = 18 * HALAKIM_PER_HOUR, - AM3_11_20 = 9 * HALAKIM_PER_HOUR + 204, - AM9_32_43 = 15 * HALAKIM_PER_HOUR + 589; - -var SUN = 0, - MON = 1, - TUES = 2, - WED = 3, - THUR = 4, - FRI = 5, - SAT = 6; - -function weekdayarr(d0, d1, d2, d3, d4, d5, d6) { - this[0] = d0; - this[1] = d1; - this[2] = d2; - this[3] = d3; - this[4] = d4; - this[5] = d5; - this[6] = d6; -} - -function gregmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11) { - this[0] = m0; - this[1] = m1; - this[2] = m2; - this[3] = m3; - this[4] = m4; - this[5] = m5; - this[6] = m6; - this[7] = m7; - this[8] = m8; - this[9] = m9; - this[10] = m10; - this[11] = m11; -} - -function hebrewmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) { - this[0] = m0; - this[1] = m1; - this[2] = m2; - this[3] = m3; - this[4] = m4; - this[5] = m5; - this[6] = m6; - this[7] = m7; - this[8] = m8; - this[9] = m9; - this[10] = m10; - this[11] = m11; - this[12] = m12; - this[13] = m13; -} - -function monthsperyeararr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18) { - this[0] = m0; - this[1] = m1; - this[2] = m2; - this[3] = m3; - this[4] = m4; - this[5] = m5; - this[6] = m6; - this[7] = m7; - this[8] = m8; - this[9] = m9; - this[10] = m10; - this[11] = m11; - this[12] = m12; - this[13] = m13; - this[14] = m14; - this[15] = m15; - this[16] = m16; - this[17] = m17; - this[18] = m18; -} - -var gWeekday = new weekdayarr("Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"), - gMonth = new gregmontharr("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), - hMonth = new hebrewmontharr("Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "AdarI", "AdarII", "Nisan", "Iyyar", "Sivan", "Tammuz", "Av", "Elul"), - mpy = new monthsperyeararr(12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 13); - -/** - * hebrewDate - * Convert the Gregorian dates into Hebrew calendar dates. - * - * @name hebrewDate - * @function - * @param {Date|Number} inputDate The date object (representing the Gregorian date) or the year. - * @param {Number?} inputMonth The Gregorian month (**one-indexed**, January being `1`!). - * @param {Number?} inputDate The Gregorian date. - * @return {Object} An object containing: - * - * - `year`: The Hebrew year. - * - `month`: The Hebrew month. - * - `month_name`: The Hebrew month name. - * - `date`: The Hebrew date. - */ -const hebrewDate = function (inputDateOrYear, inputMonth, inputDate) { - - var hebrewMonth = 0, - hebrewDate = 0, - hebrewYear = 0, - metonicCycle = 0, - metonicYear = 0, - moladDay = 0, - moladHalakim = 0; - - function GregorianToSdn(inputYear, inputMonth, inputDay) { - - var year = 0, - month = 0, - sdn = void 0; - - // Make year a positive number - if (inputYear < 0) { - year = inputYear + 4801; - } else { - year = inputYear + 4800; - } - - // Adjust the start of the year - if (inputMonth > 2) { - month = inputMonth - 3; - } else { - month = inputMonth + 9; - year--; - } - - sdn = Math.floor(Math.floor(year / 100) * DAYS_PER_400_YEARS / 4); - sdn += Math.floor(year % 100 * DAYS_PER_4_YEARS / 4); - sdn += Math.floor((month * DAYS_PER_5_MONTHS + 2) / 5); - sdn += inputDay - GREG_SDN_OFFSET; - - return sdn; - } - - function SdnToHebrew(sdn) { - var tishri1 = 0, - tishri1After = 0, - yearLength = 0, - inputDay = sdn - HEB_SDN_OFFSET; - - FindTishriMolad(inputDay); - tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); - - if (inputDay >= tishri1) { - // It found Tishri 1 at the start of the year. - hebrewYear = metonicCycle * 19 + metonicYear + 1; - if (inputDay < tishri1 + 59) { - if (inputDay < tishri1 + 30) { - hebrewMonth = 1; - hebrewDate = inputDay - tishri1 + 1; - } else { - hebrewMonth = 2; - hebrewDate = inputDay - tishri1 - 29; - } - return; - } - // We need the length of the year to figure this out,so find Tishri 1 of the next year. - moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; - moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); - moladHalakim = moladHalakim % HALAKIM_PER_DAY; - tishri1After = Tishri1((metonicYear + 1) % 19, moladDay, moladHalakim); - } else { - // It found Tishri 1 at the end of the year. - hebrewYear = metonicCycle * 19 + metonicYear; - if (inputDay >= tishri1 - 177) { - // It is one of the last 6 months of the year. - if (inputDay > tishri1 - 30) { - hebrewMonth = 13; - hebrewDate = inputDay - tishri1 + 30; - } else if (inputDay > tishri1 - 60) { - hebrewMonth = 12; - hebrewDate = inputDay - tishri1 + 60; - } else if (inputDay > tishri1 - 89) { - hebrewMonth = 11; - hebrewDate = inputDay - tishri1 + 89; - } else if (inputDay > tishri1 - 119) { - hebrewMonth = 10; - hebrewDate = inputDay - tishri1 + 119; - } else if (inputDay > tishri1 - 148) { - hebrewMonth = 9; - hebrewDate = inputDay - tishri1 + 148; - } else { - hebrewMonth = 8; - hebrewDate = inputDay - tishri1 + 178; - } - return; - } else { - if (mpy[(hebrewYear - 1) % 19] == 13) { - hebrewMonth = 7; - hebrewDate = inputDay - tishri1 + 207; - if (hebrewDate > 0) return; - hebrewMonth--; - hebrewDate += 30; - if (hebrewDate > 0) return; - hebrewMonth--; - hebrewDate += 30; - } else { - hebrewMonth = 6; - hebrewDate = inputDay - tishri1 + 207; - if (hebrewDate > 0) return; - hebrewMonth--; - hebrewDate += 30; - } - if (hebrewDate > 0) return; - hebrewMonth--; - hebrewDate += 29; - if (hebrewDate > 0) return; - // We need the length of the year to figure this out,so find Tishri 1 of this year. - tishri1After = tishri1; - FindTishriMolad(moladDay - 365); - tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); - } - } - yearLength = tishri1After - tishri1; - moladDay = inputDay - tishri1 - 29; - if (yearLength == 355 || yearLength == 385) { - // Heshvan has 30 days - if (moladDay <= 30) { - hebrewMonth = 2; - hebrewDate = moladDay; - return; - } - moladDay -= 30; - } else { - // Heshvan has 29 days - if (moladDay <= 29) { - hebrewMonth = 2; - hebrewDate = moladDay; - return; - } - moladDay -= 29; - } - // It has to be Kislev. - hebrewMonth = 3; - hebrewDate = moladDay; - } - - function FindTishriMolad(inputDay) { - // Estimate the metonic cycle number. Note that this may be an under - // estimate because there are 6939.6896 days in a metonic cycle not - // 6940,but it will never be an over estimate. The loop below will - // correct for any error in this estimate. - metonicCycle = Math.floor((inputDay + 310) / 6940); - // Calculate the time of the starting molad for this metonic cycle. - MoladOfMetonicCycle(); - // If the above was an under estimate,increment the cycle number until - // the correct one is found. For modern dates this loop is about 98.6% - // likely to not execute,even once,because the above estimate is - // really quite close. - while (moladDay < inputDay - 6940 + 310) { - metonicCycle++; - moladHalakim += HALAKIM_PER_METONIC_CYCLE; - moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); - moladHalakim = moladHalakim % HALAKIM_PER_DAY; - } - // Find the molad of Tishri closest to this date. - for (metonicYear = 0; metonicYear < 18; metonicYear++) { - if (moladDay > inputDay - 74) break; - moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; - moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); - moladHalakim = moladHalakim % HALAKIM_PER_DAY; - } - } - - function MoladOfMetonicCycle() { - var r1 = void 0, - r2 = void 0, - d1 = void 0, - d2 = void 0; - // Start with the time of the first molad after creation. - r1 = NEW_MOON_OF_CREATION; - // Calculate gMetonicCycle * HALAKIM_PER_METONIC_CYCLE. The upper 32 - // bits of the result will be in r2 and the lower 16 bits will be in r1. - r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF); - r2 = r1 >> 16; - r2 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE >> 16 & 0xFFFF); - // Calculate r2r1 / HALAKIM_PER_DAY. The remainder will be in r1,the - // upper 16 bits of the quotient will be in d2 and the lower 16 bits - // will be in d1. - d2 = Math.floor(r2 / HALAKIM_PER_DAY); - r2 -= d2 * HALAKIM_PER_DAY; - r1 = r2 << 16 | r1 & 0xFFFF; - d1 = Math.floor(r1 / HALAKIM_PER_DAY); - r1 -= d1 * HALAKIM_PER_DAY; - moladDay = d2 << 16 | d1; - moladHalakim = r1; - } - - function Tishri1(metonicYear, moladDay, moladHalakim) { - var tishri1 = moladDay, - dow = tishri1 % 7, - leapYear = metonicYear == 2 || metonicYear == 5 || metonicYear == 7 || metonicYear == 10 || metonicYear == 13 || metonicYear == 16 || metonicYear == 18, - lastWasLeapYear = metonicYear == 3 || metonicYear == 6 || metonicYear == 8 || metonicYear == 11 || metonicYear == 14 || metonicYear == 17 || metonicYear == 0; - - // Apply rules 2,3 and 4 - if (moladHalakim >= NOON || !leapYear && dow == TUES && moladHalakim >= AM3_11_20 || lastWasLeapYear && dow == MON && moladHalakim >= AM9_32_43) { - tishri1++; - dow++; - if (dow == 7) dow = 0; - } - - // Apply rule 1 after the others because it can cause an additional delay of one day. - if (dow == WED || dow == FRI || dow == SUN) { - tishri1++; - } - - return tishri1; - } - - var inputYear = inputDateOrYear; - - if ((typeof inputYear === "undefined" ? "undefined" : _typeof(inputYear)) === "object") { - inputMonth = inputDateOrYear.getMonth() + 1; - inputDate = inputDateOrYear.getDate(); - inputYear = inputDateOrYear.getFullYear(); - } - - SdnToHebrew(GregorianToSdn(inputYear, inputMonth, inputDate)); - - return { - year: hebrewYear, - month: hebrewMonth, - date: hebrewDate, - month_name: hMonth[hebrewMonth - 1] - }; -}; - - -g.setFont("Vector",10); let now = new Date(); -let today = hebrewDate(now); +let today = require("hebrewDate")(now); var mainmenu = { "" : { diff --git a/apps/hebrew_calendar/hebrewDate.js b/apps/hebrew_calendar/hebrewDate.js new file mode 100644 index 000000000..bbefb4499 --- /dev/null +++ b/apps/hebrew_calendar/hebrewDate.js @@ -0,0 +1,359 @@ +/*! + * This script was taked from this page and ported to Node.js by Ionic Bizu + * http://www.shamash.org/help/javadate.shtml + * + * This script was adapted from C sources written by + * Scott E. Lee, which contain the following copyright notice: + * + * Copyright 1993-1995, Scott E. Lee, all rights reserved. + * Permission granted to use, copy, modify, distribute and sell so long as + * the above copyright and this permission statement are retained in all + * copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK. + * + * Bill Hastings + * RBI Software Systems + * bhastings@rbi.com + */ + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var GREG_SDN_OFFSET = 32045, + DAYS_PER_5_MONTHS = 153, + DAYS_PER_4_YEARS = 1461, + DAYS_PER_400_YEARS = 146097; + +var HALAKIM_PER_HOUR = 1080, + HALAKIM_PER_DAY = 25920, + HALAKIM_PER_LUNAR_CYCLE = 29 * HALAKIM_PER_DAY + 13753, + HALAKIM_PER_METONIC_CYCLE = HALAKIM_PER_LUNAR_CYCLE * (12 * 19 + 7); + +var HEB_SDN_OFFSET = 347997, + NEW_MOON_OF_CREATION = 31524, + NOON = 18 * HALAKIM_PER_HOUR, + AM3_11_20 = 9 * HALAKIM_PER_HOUR + 204, + AM9_32_43 = 15 * HALAKIM_PER_HOUR + 589; + +var SUN = 0, + MON = 1, + TUES = 2, + WED = 3, + THUR = 4, + FRI = 5, + SAT = 6; + +function weekdayarr(d0, d1, d2, d3, d4, d5, d6) { + this[0] = d0; + this[1] = d1; + this[2] = d2; + this[3] = d3; + this[4] = d4; + this[5] = d5; + this[6] = d6; +} + +function gregmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; +} + +function hebrewmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; + this[12] = m12; + this[13] = m13; +} + +function monthsperyeararr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16, m17, m18) { + this[0] = m0; + this[1] = m1; + this[2] = m2; + this[3] = m3; + this[4] = m4; + this[5] = m5; + this[6] = m6; + this[7] = m7; + this[8] = m8; + this[9] = m9; + this[10] = m10; + this[11] = m11; + this[12] = m12; + this[13] = m13; + this[14] = m14; + this[15] = m15; + this[16] = m16; + this[17] = m17; + this[18] = m18; +} + +var gWeekday = new weekdayarr("Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"), + gMonth = new gregmontharr("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), + hMonth = new hebrewmontharr("Tishri", "Heshvan", "Kislev", "Tevet", "Shevat", "AdarI", "AdarII", "Nisan", "Iyyar", "Sivan", "Tammuz", "Av", "Elul"), + mpy = new monthsperyeararr(12, 12, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 13); + +/** + * hebrewDate + * Convert the Gregorian dates into Hebrew calendar dates. + * + * @name hebrewDate + * @function + * @param {Date|Number} inputDate The date object (representing the Gregorian date) or the year. + * @param {Number?} inputMonth The Gregorian month (**one-indexed**, January being `1`!). + * @param {Number?} inputDate The Gregorian date. + * @return {Object} An object containing: + * + * - `year`: The Hebrew year. + * - `month`: The Hebrew month. + * - `month_name`: The Hebrew month name. + * - `date`: The Hebrew date. + */ +const hebrewDate = function (inputDateOrYear, inputMonth, inputDate) { + + var hebrewMonth = 0, + hebrewDate = 0, + hebrewYear = 0, + metonicCycle = 0, + metonicYear = 0, + moladDay = 0, + moladHalakim = 0; + + function GregorianToSdn(inputYear, inputMonth, inputDay) { + + var year = 0, + month = 0, + sdn = void 0; + + // Make year a positive number + if (inputYear < 0) { + year = inputYear + 4801; + } else { + year = inputYear + 4800; + } + + // Adjust the start of the year + if (inputMonth > 2) { + month = inputMonth - 3; + } else { + month = inputMonth + 9; + year--; + } + + sdn = Math.floor(Math.floor(year / 100) * DAYS_PER_400_YEARS / 4); + sdn += Math.floor(year % 100 * DAYS_PER_4_YEARS / 4); + sdn += Math.floor((month * DAYS_PER_5_MONTHS + 2) / 5); + sdn += inputDay - GREG_SDN_OFFSET; + + return sdn; + } + + function SdnToHebrew(sdn) { + var tishri1 = 0, + tishri1After = 0, + yearLength = 0, + inputDay = sdn - HEB_SDN_OFFSET; + + FindTishriMolad(inputDay); + tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); + + if (inputDay >= tishri1) { + // It found Tishri 1 at the start of the year. + hebrewYear = metonicCycle * 19 + metonicYear + 1; + if (inputDay < tishri1 + 59) { + if (inputDay < tishri1 + 30) { + hebrewMonth = 1; + hebrewDate = inputDay - tishri1 + 1; + } else { + hebrewMonth = 2; + hebrewDate = inputDay - tishri1 - 29; + } + return; + } + // We need the length of the year to figure this out,so find Tishri 1 of the next year. + moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + tishri1After = Tishri1((metonicYear + 1) % 19, moladDay, moladHalakim); + } else { + // It found Tishri 1 at the end of the year. + hebrewYear = metonicCycle * 19 + metonicYear; + if (inputDay >= tishri1 - 177) { + // It is one of the last 6 months of the year. + if (inputDay > tishri1 - 30) { + hebrewMonth = 13; + hebrewDate = inputDay - tishri1 + 30; + } else if (inputDay > tishri1 - 60) { + hebrewMonth = 12; + hebrewDate = inputDay - tishri1 + 60; + } else if (inputDay > tishri1 - 89) { + hebrewMonth = 11; + hebrewDate = inputDay - tishri1 + 89; + } else if (inputDay > tishri1 - 119) { + hebrewMonth = 10; + hebrewDate = inputDay - tishri1 + 119; + } else if (inputDay > tishri1 - 148) { + hebrewMonth = 9; + hebrewDate = inputDay - tishri1 + 148; + } else { + hebrewMonth = 8; + hebrewDate = inputDay - tishri1 + 178; + } + return; + } else { + if (mpy[(hebrewYear - 1) % 19] == 13) { + hebrewMonth = 7; + hebrewDate = inputDay - tishri1 + 207; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + } else { + hebrewMonth = 6; + hebrewDate = inputDay - tishri1 + 207; + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 30; + } + if (hebrewDate > 0) return; + hebrewMonth--; + hebrewDate += 29; + if (hebrewDate > 0) return; + // We need the length of the year to figure this out,so find Tishri 1 of this year. + tishri1After = tishri1; + FindTishriMolad(moladDay - 365); + tishri1 = Tishri1(metonicYear, moladDay, moladHalakim); + } + } + yearLength = tishri1After - tishri1; + moladDay = inputDay - tishri1 - 29; + if (yearLength == 355 || yearLength == 385) { + // Heshvan has 30 days + if (moladDay <= 30) { + hebrewMonth = 2; + hebrewDate = moladDay; + return; + } + moladDay -= 30; + } else { + // Heshvan has 29 days + if (moladDay <= 29) { + hebrewMonth = 2; + hebrewDate = moladDay; + return; + } + moladDay -= 29; + } + // It has to be Kislev. + hebrewMonth = 3; + hebrewDate = moladDay; + } + + function FindTishriMolad(inputDay) { + // Estimate the metonic cycle number. Note that this may be an under + // estimate because there are 6939.6896 days in a metonic cycle not + // 6940,but it will never be an over estimate. The loop below will + // correct for any error in this estimate. + metonicCycle = Math.floor((inputDay + 310) / 6940); + // Calculate the time of the starting molad for this metonic cycle. + MoladOfMetonicCycle(); + // If the above was an under estimate,increment the cycle number until + // the correct one is found. For modern dates this loop is about 98.6% + // likely to not execute,even once,because the above estimate is + // really quite close. + while (moladDay < inputDay - 6940 + 310) { + metonicCycle++; + moladHalakim += HALAKIM_PER_METONIC_CYCLE; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + } + // Find the molad of Tishri closest to this date. + for (metonicYear = 0; metonicYear < 18; metonicYear++) { + if (moladDay > inputDay - 74) break; + moladHalakim += HALAKIM_PER_LUNAR_CYCLE * mpy[metonicYear]; + moladDay += Math.floor(moladHalakim / HALAKIM_PER_DAY); + moladHalakim = moladHalakim % HALAKIM_PER_DAY; + } + } + + function MoladOfMetonicCycle() { + var r1 = void 0, + r2 = void 0, + d1 = void 0, + d2 = void 0; + // Start with the time of the first molad after creation. + r1 = NEW_MOON_OF_CREATION; + // Calculate gMetonicCycle * HALAKIM_PER_METONIC_CYCLE. The upper 32 + // bits of the result will be in r2 and the lower 16 bits will be in r1. + r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF); + r2 = r1 >> 16; + r2 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE >> 16 & 0xFFFF); + // Calculate r2r1 / HALAKIM_PER_DAY. The remainder will be in r1,the + // upper 16 bits of the quotient will be in d2 and the lower 16 bits + // will be in d1. + d2 = Math.floor(r2 / HALAKIM_PER_DAY); + r2 -= d2 * HALAKIM_PER_DAY; + r1 = r2 << 16 | r1 & 0xFFFF; + d1 = Math.floor(r1 / HALAKIM_PER_DAY); + r1 -= d1 * HALAKIM_PER_DAY; + moladDay = d2 << 16 | d1; + moladHalakim = r1; + } + + function Tishri1(metonicYear, moladDay, moladHalakim) { + var tishri1 = moladDay, + dow = tishri1 % 7, + leapYear = metonicYear == 2 || metonicYear == 5 || metonicYear == 7 || metonicYear == 10 || metonicYear == 13 || metonicYear == 16 || metonicYear == 18, + lastWasLeapYear = metonicYear == 3 || metonicYear == 6 || metonicYear == 8 || metonicYear == 11 || metonicYear == 14 || metonicYear == 17 || metonicYear == 0; + + // Apply rules 2,3 and 4 + if (moladHalakim >= NOON || !leapYear && dow == TUES && moladHalakim >= AM3_11_20 || lastWasLeapYear && dow == MON && moladHalakim >= AM9_32_43) { + tishri1++; + dow++; + if (dow == 7) dow = 0; + } + + // Apply rule 1 after the others because it can cause an additional delay of one day. + if (dow == WED || dow == FRI || dow == SUN) { + tishri1++; + } + + return tishri1; + } + + var inputYear = inputDateOrYear; + + if ((typeof inputYear === "undefined" ? "undefined" : _typeof(inputYear)) === "object") { + inputMonth = inputDateOrYear.getMonth() + 1; + inputDate = inputDateOrYear.getDate(); + inputYear = inputDateOrYear.getFullYear(); + } + + SdnToHebrew(GregorianToSdn(inputYear, inputMonth, inputDate)); + + return { + year: hebrewYear, + month: hebrewMonth, + date: hebrewDate, + month_name: hMonth[hebrewMonth - 1] + }; +}; \ No newline at end of file From d5cd869b2fedadc2105f7dd1f9ce9ba0453297bf Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 10:57:50 +0200 Subject: [PATCH 15/20] refactor: typescript! refactor: rollup! --- apps/hebrew_calendar/app.js | 28 +---------------- apps/hebrew_calendar/package.json | 23 ++++++++++++++ apps/hebrew_calendar/rollup.config.js | 15 +++++++++ apps/hebrew_calendar/src/app.ts | 32 ++++++++++++++++++++ apps/hebrew_calendar/{ => src}/hebrewDate.js | 0 apps/hebrew_calendar/tsconfig.json | 10 ++++++ 6 files changed, 81 insertions(+), 27 deletions(-) create mode 100644 apps/hebrew_calendar/package.json create mode 100644 apps/hebrew_calendar/rollup.config.js create mode 100644 apps/hebrew_calendar/src/app.ts rename apps/hebrew_calendar/{ => src}/hebrewDate.js (100%) create mode 100644 apps/hebrew_calendar/tsconfig.json diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index 074c22988..ff30920e7 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -1,27 +1 @@ -g.clear(); - -let now = new Date(); -let today = require("hebrewDate")(now); - -var mainmenu = { - "" : { - "title" : "Hebrew Date" - }, - cal: { - value: require('locale').date(now,1), - onchange : () => {} - }, - date: { - value : today.date, - onchange : () => {} - }, - month: { - value : today.month_name, - onchange : () => {} - }, - year: { - value : today.year, - onchange : () => {} - } -}; -E.showMenu(mainmenu); +!function(){"use strict";g.clear();let e=new Date,a=require("hebrewDate")(e);var n={"":{title:"Hebrew Date"},cal:{value:require("locale").date(e,1),onchange:()=>{}},date:{value:a.date,onchange:()=>{}},month:{value:a.month_name,onchange:()=>{}},year:{value:a.year,onchange:()=>{}}};E.showMenu(n)}(); diff --git a/apps/hebrew_calendar/package.json b/apps/hebrew_calendar/package.json new file mode 100644 index 000000000..c509b70bb --- /dev/null +++ b/apps/hebrew_calendar/package.json @@ -0,0 +1,23 @@ +{ + "name": "hebrew_calendar", + "version": "0.0.1", + "description": "Bangle.js app for seeing hebrew calendar", + "main": "app.js", + "types": "app.d.ts", + "scripts": { + "build": "rollup -c" + }, + "author": { + "name": "Michael Salaverry", + "url": "https://github.com/barakplasma" + }, + "license": "MIT", + "devDependencies": { + "@rollup/plugin-typescript": "^4.1.1", + "rollup": "^2.10.2", + "rollup-plugin-terser": "^5.3.0", + "terser": "^4.7.0", + "tslib": "^2.0.0", + "typescript": "^3.9.2" + } +} diff --git a/apps/hebrew_calendar/rollup.config.js b/apps/hebrew_calendar/rollup.config.js new file mode 100644 index 000000000..5f7f0746f --- /dev/null +++ b/apps/hebrew_calendar/rollup.config.js @@ -0,0 +1,15 @@ +import typescript from '@rollup/plugin-typescript'; +import { terser } from 'rollup-plugin-terser'; + +export default { + input: './src/app.ts', + output: { + dir: '.', + format: 'iife', + name: 'hebrew_calendar' + }, + plugins: [ + typescript(), + terser(), + ] +}; diff --git a/apps/hebrew_calendar/src/app.ts b/apps/hebrew_calendar/src/app.ts new file mode 100644 index 000000000..111f47184 --- /dev/null +++ b/apps/hebrew_calendar/src/app.ts @@ -0,0 +1,32 @@ +declare var Bangle: any; +declare var g: any; +declare var E: any; +declare var require: any; + +g.clear(); + +let now = new Date(); +let today = require("hebrewDate")(now); + +var mainmenu = { + "" : { + "title" : "Hebrew Date" + }, + cal: { + value: require('locale').date(now,1), + onchange : () => {} + }, + date: { + value : today.date, + onchange : () => {} + }, + month: { + value : today.month_name, + onchange : () => {} + }, + year: { + value : today.year, + onchange : () => {} + } +}; +E.showMenu(mainmenu); diff --git a/apps/hebrew_calendar/hebrewDate.js b/apps/hebrew_calendar/src/hebrewDate.js similarity index 100% rename from apps/hebrew_calendar/hebrewDate.js rename to apps/hebrew_calendar/src/hebrewDate.js diff --git a/apps/hebrew_calendar/tsconfig.json b/apps/hebrew_calendar/tsconfig.json new file mode 100644 index 000000000..a341a5a5e --- /dev/null +++ b/apps/hebrew_calendar/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "es2015", + "noImplicitAny": true, + "target": "es2015" + }, + "include": [ + "src" + ] +} From 4c5134ff423ef12718641f815c6103985e416bda Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 11:17:58 +0200 Subject: [PATCH 16/20] bump: version --- apps.json | 2 +- apps/hebrew_calendar/ChangeLog | 1 + apps/hebrew_calendar/package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 992cce5d6..d7218d428 100644 --- a/apps.json +++ b/apps.json @@ -33,7 +33,7 @@ "id": "hebrew_calendar", "name": "Hebrew Calendar", "shortName": "HebCal", - "version": "0.01", + "version": "0.02", "description": "lists the date according to the hebrew calendar", "icon": "app.png", "tags": "", diff --git a/apps/hebrew_calendar/ChangeLog b/apps/hebrew_calendar/ChangeLog index 5560f00bc..b2ac114ef 100644 --- a/apps/hebrew_calendar/ChangeLog +++ b/apps/hebrew_calendar/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: using TS and rollup to bundle \ No newline at end of file diff --git a/apps/hebrew_calendar/package.json b/apps/hebrew_calendar/package.json index c509b70bb..d43cc6ad9 100644 --- a/apps/hebrew_calendar/package.json +++ b/apps/hebrew_calendar/package.json @@ -1,6 +1,6 @@ { "name": "hebrew_calendar", - "version": "0.0.1", + "version": "0.0.2", "description": "Bangle.js app for seeing hebrew calendar", "main": "app.js", "types": "app.d.ts", From 355c2ba37e0c4ca667d068cfd527f4234d17b15b Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 11:34:50 +0200 Subject: [PATCH 17/20] refactor: js to ts --- apps/hebrew_calendar/app.js | 18 +++++++++++++++++- apps/hebrew_calendar/src/app.ts | 4 +++- .../src/{hebrewDate.js => hebrewDate.ts} | 9 ++++----- apps/hebrew_calendar/tsconfig.json | 2 +- 4 files changed, 25 insertions(+), 8 deletions(-) rename apps/hebrew_calendar/src/{hebrewDate.js => hebrewDate.ts} (97%) diff --git a/apps/hebrew_calendar/app.js b/apps/hebrew_calendar/app.js index ff30920e7..9c21fa89b 100644 --- a/apps/hebrew_calendar/app.js +++ b/apps/hebrew_calendar/app.js @@ -1 +1,17 @@ -!function(){"use strict";g.clear();let e=new Date,a=require("hebrewDate")(e);var n={"":{title:"Hebrew Date"},cal:{value:require("locale").date(e,1),onchange:()=>{}},date:{value:a.date,onchange:()=>{}},month:{value:a.month_name,onchange:()=>{}},year:{value:a.year,onchange:()=>{}}};E.showMenu(n)}(); +!function(){"use strict"; +/*! + * This script was taked from this page and ported to Node.js by Ionic Bizu + * http://www.shamash.org/help/javadate.shtml + * + * This script was adapted from C sources written by + * Scott E. Lee, which contain the following copyright notice: + * + * Copyright 1993-1995, Scott E. Lee, all rights reserved. + * Permission granted to use, copy, modify, distribute and sell so long as + * the above copyright and this permission statement are retained in all + * copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK. + * + * Bill Hastings + * RBI Software Systems + * bhastings@rbi.com + */var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};var i=new function(t,i,e,o,r,n,h,a,s,f,u,l,v,c){this[0]=t,this[1]=i,this[2]=e,this[3]=o,this[4]=r,this[5]=n,this[6]=h,this[7]=a,this[8]=s,this[9]=f,this[10]=u,this[11]=l,this[12]=v,this[13]=c}("Tishri","Heshvan","Kislev","Tevet","Shevat","AdarI","AdarII","Nisan","Iyyar","Sivan","Tammuz","Av","Elul"),e=new function(t,i,e,o,r,n,h,a,s,f,u,l,v,c,y,d,m,M,b){this[0]=t,this[1]=i,this[2]=e,this[3]=o,this[4]=r,this[5]=n,this[6]=h,this[7]=a,this[8]=s,this[9]=f,this[10]=u,this[11]=l,this[12]=v,this[13]=c,this[14]=y,this[15]=d,this[16]=m,this[17]=M,this[18]=b}(12,12,13,12,12,13,12,13,12,12,13,12,12,13,12,12,13,12,13);g.clear();let o=new Date,r=function(o){var r,n,h=0,a=0,s=0,f=0,u=0,l=0,v=0;function c(t){var i,o,r,n;for(f=Math.floor((t+310)/6940),r=void 0,n=void 0,r=31524,n=(r+=45971*f)>>16,n+=2744*f,o=Math.floor(n/25920),r=(n-=25920*o)<<16|65535&r,i=Math.floor(r/25920),l=o<<16|i,v=r-=25920*i;lt-74);u++)v+=765433*e[u],l+=Math.floor(v/25920),v%=25920}function y(t,i,e){var o=i,r=o%7;return(e>=19440||!(2==t||5==t||7==t||10==t||13==t||16==t||18==t)&&2==r&&e>=9924||(3==t||6==t||8==t||11==t||14==t||17==t||0==t)&&1==r&&e>=16789)&&(o++,7==++r&&(r=0)),3!=r&&5!=r&&0!=r||o++,o}var d=o;return"object"===(void 0===d?"undefined":t(d))&&(r=o.getMonth()+1,n=o.getDate(),d=o.getFullYear()),function(t){var i,o=0,r=0,n=t-347997;if(c(n),n>=(o=y(u,l,v))){if(s=19*f+u+1,n=o-177)return void(n>o-30?(h=13,a=n-o+30):n>o-60?(h=12,a=n-o+60):n>o-89?(h=11,a=n-o+89):n>o-119?(h=10,a=n-o+119):n>o-148?(h=9,a=n-o+148):(h=8,a=n-o+178));if(13==e[(s-1)%19]){if(h=7,(a=n-o+207)>0)return;if(h--,(a+=30)>0)return;h--,a+=30}else{if(h=6,(a=n-o+207)>0)return;h--,a+=30}if(a>0)return;if(h--,(a+=29)>0)return;r=o,c(l-365),o=y(u,l,v)}if(l=n-o-29,355==(i=r-o)||385==i){if(l<=30)return h=2,void(a=l);l-=30}else{if(l<=29)return h=2,void(a=l);l-=29}h=3,a=l}(function(t,i,e){var o=0,r=0,n=void 0;return o=t<0?t+4801:t+4800,i>2?r=i-3:(r=i+9,o--),n=Math.floor(146097*Math.floor(o/100)/4),n+=Math.floor(o%100*1461/4),n+=Math.floor((153*r+2)/5),n+=e-32045}(d,r,n)),{year:s,month:h,date:a,month_name:i[h-1]}}(o);var n={"":{title:"Hebrew Date"},cal:{value:require("locale").date(o,1),onchange:()=>{}},date:{value:r.date,onchange:()=>{}},month:{value:r.month_name,onchange:()=>{}},year:{value:r.year,onchange:()=>{}}};E.showMenu(n)}(); diff --git a/apps/hebrew_calendar/src/app.ts b/apps/hebrew_calendar/src/app.ts index 111f47184..51314e337 100644 --- a/apps/hebrew_calendar/src/app.ts +++ b/apps/hebrew_calendar/src/app.ts @@ -6,7 +6,9 @@ declare var require: any; g.clear(); let now = new Date(); -let today = require("hebrewDate")(now); +import { hebrewDate } from "./hebrewDate"; + +let today = hebrewDate(now); var mainmenu = { "" : { diff --git a/apps/hebrew_calendar/src/hebrewDate.js b/apps/hebrew_calendar/src/hebrewDate.ts similarity index 97% rename from apps/hebrew_calendar/src/hebrewDate.js rename to apps/hebrew_calendar/src/hebrewDate.ts index bbefb4499..cc3a5ed78 100644 --- a/apps/hebrew_calendar/src/hebrewDate.js +++ b/apps/hebrew_calendar/src/hebrewDate.ts @@ -66,7 +66,7 @@ function gregmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11) { this[11] = m11; } -function hebrewmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) { +function hebrewmontharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13?: any) { this[0] = m0; this[1] = m1; this[2] = m2; @@ -117,8 +117,6 @@ var gWeekday = new weekdayarr("Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "S * @name hebrewDate * @function * @param {Date|Number} inputDate The date object (representing the Gregorian date) or the year. - * @param {Number?} inputMonth The Gregorian month (**one-indexed**, January being `1`!). - * @param {Number?} inputDate The Gregorian date. * @return {Object} An object containing: * * - `year`: The Hebrew year. @@ -126,7 +124,8 @@ var gWeekday = new weekdayarr("Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "S * - `month_name`: The Hebrew month name. * - `date`: The Hebrew date. */ -const hebrewDate = function (inputDateOrYear, inputMonth, inputDate) { +export const hebrewDate = function (inputDateOrYear: Date) { + var inputMonth, inputDate; var hebrewMonth = 0, hebrewDate = 0, @@ -340,7 +339,7 @@ const hebrewDate = function (inputDateOrYear, inputMonth, inputDate) { return tishri1; } - var inputYear = inputDateOrYear; + var inputYear: Date | number = inputDateOrYear; if ((typeof inputYear === "undefined" ? "undefined" : _typeof(inputYear)) === "object") { inputMonth = inputDateOrYear.getMonth() + 1; diff --git a/apps/hebrew_calendar/tsconfig.json b/apps/hebrew_calendar/tsconfig.json index a341a5a5e..30a9e35f4 100644 --- a/apps/hebrew_calendar/tsconfig.json +++ b/apps/hebrew_calendar/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "es2015", - "noImplicitAny": true, + "noImplicitAny": false, "target": "es2015" }, "include": [ From 60ba4ed3f181a4ab13705a2409d9a9d908d61847 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 11:42:08 +0200 Subject: [PATCH 18/20] Revert "feat: use sfo as tz" This reverts commit 1271d28720d84a1321fd9bca8ecd0aa16ea4eb51. --- apps/a_clock_timer/app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index 8d078ffe9..5f9a3a468 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -102,19 +102,20 @@ function queueNextDraw() { function draw() { g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - + var x_sun = 176 - (getGmt().getHours() / 24 * 176 + 4); g.setColor('#ff0').drawLine(x_sun, g.getHeight()-IMAGEHEIGHT, x_sun, g.getHeight()); g.reset(); var locale = require("locale"); - + var date = new Date(); g.setFontAlign(0,0); g.setFont("Michroma36").drawString(locale.time(date,1), g.getWidth()/2, 46); g.setFont("6x8"); g.drawString(locale.date(new Date(),1), 125, 68); - g.drawString("SFO "+locale.time(getTimeFromTimezone(-8),1), 125, 80); + g.drawString("PAR "+locale.time(getTimeFromTimezone(1),1), 125, 80); + g.drawString("TYO "+locale.time(getTimeFromTimezone(9),1), 125, 88); queueNextDraw(); } From a8f69af1535024dd852fc490e20abfdd48421450 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 11:49:52 +0200 Subject: [PATCH 19/20] fix: travis by making it mjs --- apps/hebrew_calendar/{rollup.config.js => rollup.config.mjs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/hebrew_calendar/{rollup.config.js => rollup.config.mjs} (100%) diff --git a/apps/hebrew_calendar/rollup.config.js b/apps/hebrew_calendar/rollup.config.mjs similarity index 100% rename from apps/hebrew_calendar/rollup.config.js rename to apps/hebrew_calendar/rollup.config.mjs From 00e05c2f2187e2d6f5b7a267026396a36a3a4b68 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 4 Dec 2021 11:55:07 +0200 Subject: [PATCH 20/20] feat: support bangle 1 by changing apps.json --- apps.json | 3 ++- apps/hebrew_calendar/ChangeLog | 3 ++- apps/hebrew_calendar/package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index d7218d428..5b6eac06d 100644 --- a/apps.json +++ b/apps.json @@ -33,11 +33,12 @@ "id": "hebrew_calendar", "name": "Hebrew Calendar", "shortName": "HebCal", - "version": "0.02", + "version": "0.03", "description": "lists the date according to the hebrew calendar", "icon": "app.png", "tags": "", "supports": [ + "BANGLEJS", "BANGLEJS2" ], "readme": "README.md", diff --git a/apps/hebrew_calendar/ChangeLog b/apps/hebrew_calendar/ChangeLog index b2ac114ef..d7dbc19e3 100644 --- a/apps/hebrew_calendar/ChangeLog +++ b/apps/hebrew_calendar/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: using TS and rollup to bundle \ No newline at end of file +0.02: using TS and rollup to bundle +0.03: bug fixes and support bangle 1 \ No newline at end of file diff --git a/apps/hebrew_calendar/package.json b/apps/hebrew_calendar/package.json index d43cc6ad9..85e9ebbf0 100644 --- a/apps/hebrew_calendar/package.json +++ b/apps/hebrew_calendar/package.json @@ -1,6 +1,6 @@ { "name": "hebrew_calendar", - "version": "0.0.2", + "version": "0.0.3", "description": "Bangle.js app for seeing hebrew calendar", "main": "app.js", "types": "app.d.ts",