summaryrefslogtreecommitdiffstats
path: root/korganizer/plugins/hebrew/holiday.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'korganizer/plugins/hebrew/holiday.cpp')
-rw-r--r--korganizer/plugins/hebrew/holiday.cpp431
1 files changed, 431 insertions, 0 deletions
diff --git a/korganizer/plugins/hebrew/holiday.cpp b/korganizer/plugins/hebrew/holiday.cpp
new file mode 100644
index 00000000..732a0044
--- /dev/null
+++ b/korganizer/plugins/hebrew/holiday.cpp
@@ -0,0 +1,431 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Jonathan Singer *
+ * jsinger@leeta.net *
+ * Calendar routines from Hebrew Calendar by Frank Yellin *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#include "holiday.h"
+#include <klocale.h>
+
+bool Holiday::CholP;
+bool Holiday::OmerP;
+bool Holiday::ParshaP;
+
+QStringList Holiday::holidays;
+int Holiday::HolidayFlags;
+
+Holiday::Holiday()
+{
+
+}
+
+Holiday::~Holiday()
+{
+}
+
+/* Given a day of the Hebrew month, figuring out all the interesting holidays that
+* correspond to that date. ParshaP, OmerP, and CholP determine whether we should
+* given info about the Parsha of the week, the Sfira, or Chol Hamoed.
+*
+* We are also influenced by the IsraelP flag
+*/
+
+QStringList
+ Holiday::FindHoliday(int month, int day, int weekday, int kvia,
+ bool leap_year_p, bool israel_p,
+ int day_number, int year)
+{
+
+ enum
+ { Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
+ };
+
+ holidays.clear();
+ bool shabbat_p = (weekday == Saturday); // Is it a Saturday?
+
+ // Treat Adar in a non-leap year as if it were Adar II.
+ if ((month == 12) && !leap_year_p)
+ month = 13;
+ switch (month)
+ {
+ case 1: /* Nissan */
+ switch (day)
+ {
+ case 1:
+ if (shabbat_p)
+ holidays <<
+ i18n
+ ("These are Jewish holidays and mostly do not have translations. They may have different spellings in your language; otherwise, just translate the sound to your characters",
+ "Sh. HaHodesh");
+ break;
+ case 14:
+ if (!shabbat_p)
+ // If it's Shabbat, we have three pieces of info.
+ // This is the least important.
+ holidays << i18n("Erev Pesach");
+ /* Fall thru */
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ // The Saturday before Pesach (8th-14th)
+ if (shabbat_p)
+ holidays << i18n("Sh. HaGadol");
+ break;
+ case 15:
+ case 16:
+ case 21:
+ case 22:
+ if (!israel_p || (day == 15) || (day == 21))
+ {
+ holidays << i18n("Pesach");
+ break;
+ }
+ else if (day == 22)
+ break;
+ /* else fall through */
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ if (CholP)
+ holidays << i18n("Chol Hamoed");
+ break;
+ case 27:
+ // Yom HaShoah only exists since Israel was established.
+ if (year > 1948 + 3760)
+ holidays << i18n("Yom HaShoah");
+ break;
+ }
+ if ((day > 15) && OmerP)
+ // Count the Omer, starting after the first day of Pesach.
+ holidays << Sfirah(day - 15);
+ break;
+
+ case 2: /* Iyar */
+ switch (day)
+ {
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ // Yom HaAtzmaut is on the 5th, unless that's a Saturday, in which
+ // case it is moved back two days to Thursday. Yom HaZikaron is
+ // the day before Yom HaAtzmaut.
+ if (year >= 1948 + 3760)
+ { // only after Israel established.
+ switch (weekday)
+ {
+ case Wednesday:
+ if (day == 5)
+ holidays << i18n("Yom HaAtzmaut");
+ else
+ holidays << i18n("Yom HaZikaron");
+ break;
+ case Thursday:
+ // This can't be 2 Iyar.
+ holidays << i18n("Yom HaAtzmaut");
+ break;
+ case Friday:
+ case Saturday:
+ // These are never either of them.
+ break;
+ default:
+ // All other days follow the normal rules.
+ if (day == 4)
+ holidays << i18n("Yom HaZikaron");
+ else if (day == 5)
+ holidays << i18n("Yom HaAtzmaut");
+ }
+ }
+ break;
+ case 28:
+ // only since the 1967 war
+ if (year > 1967 + 3760)
+ holidays << i18n("Yom Yerushalayim");
+ break;
+ case 18:
+ holidays << i18n("Lag BaOmer");
+ break;
+ }
+ if ((day != 18) && OmerP)
+ // Sfirah the whole month. But Lag BaOmer is already mentioned.
+ holidays << Sfirah(day + 15);
+
+ break;
+
+ case 3: /* Sivan */
+ switch (day)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ // Sfirah until Shavuot
+ if (OmerP)
+ holidays << Sfirah(day + 44);
+ break;
+ case 5:
+ // Don't need to mention Sfira(49) if there's already two other
+ // pieces of information
+ if (OmerP && !shabbat_p)
+ holidays << Sfirah(49);
+ holidays << i18n("Erev Shavuot");
+ break;
+ case 6:
+ case 7:
+ if (!israel_p || (day == 6))
+ holidays << i18n("Shavuot");
+ break;
+ }
+ break;
+
+ case 4: /* Tamuz */
+ // 17th of Tamuz, except Shabbat pushes it to Sunday.
+ if ((!shabbat_p && (day == 17))
+ || ((weekday == 1) && (day == 18)))
+ holidays << i18n("Tzom Tammuz");
+ break;
+
+ case 5: /* Ab */
+ if (shabbat_p && (3 <= day) && (day <= 16))
+ // The shabbat before and after Tisha B'Av are special
+ if (day <= 9)
+ holidays << i18n("Sh. Hazon");
+ else
+ holidays << i18n("Sh. Nahamu");
+ else if ((!shabbat_p && (day == 9))
+ || ((weekday == 1) && (day == 10)))
+ // 9th of Av, except Shabbat pushes it to Sunday.
+ holidays << i18n("Tisha B'Av");
+ break;
+
+ case 6: /* Elul */
+ if ((day >= 20) && (day <= 26) && shabbat_p)
+ holidays << i18n("S'lichot");
+ else if (day == 29)
+ holidays << i18n("Erev R.H.");
+ break;
+
+ case 7: /* Tishrei */
+ switch (day)
+ {
+ case 1:
+ case 2:
+ holidays << i18n("Rosh Hashana");
+ break;
+ case 3:
+ if (shabbat_p)
+ holidays << i18n("Sh. Shuvah");
+ else
+ holidays << i18n("Tzom Gedalia");
+ break;
+ case 4:
+ if (weekday == 1)
+ holidays << i18n("Tzom Gedalia");
+ /* fall through */
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (shabbat_p)
+ holidays << i18n("Sh. Shuvah");
+ break;
+ case 9:
+ holidays << i18n("Erev Y.K.");
+ break;
+ case 10:
+ holidays << i18n("Yom Kippur");
+ break;
+ case 14:
+ holidays << i18n("Erev Sukkot");
+ break;
+ case 15:
+ case 16:
+ if (!israel_p || (day == 15))
+ {
+ holidays << i18n("Sukkot");
+ break;
+ }
+ /* else fall through */
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ if (CholP)
+ holidays << i18n("Chol Hamoed");
+ break;
+ case 21:
+ holidays << i18n("Hoshana Rabah");
+ break;
+ case 22:
+ holidays << i18n("Shmini Atzeret");
+ break;
+ case 23:
+ if (!israel_p)
+ holidays << i18n("Simchat Torah");
+ break;
+ }
+ break;
+ case 8: /* Cheshvan */
+ break;
+
+ case 9: /* Kislev */
+ if (day == 24)
+ holidays << i18n("Erev Hanukah");
+ else if (day >= 25)
+ holidays << i18n("Hanukah");
+ break;
+
+ case 10: /* Tevet */
+ if (day <= (kvia == 0 ? 3 : 2))
+ // Need to know length of Kislev to determine last day of Chanukah
+ holidays << i18n("Hanukah");
+ else if (((day == 10) && !shabbat_p)
+ || ((day == 11) && (weekday == 1)))
+ // 10th of Tevet. Shabbat pushes it to Sunday
+ holidays << i18n("Tzom Tevet");
+ break;
+
+ case 11: /* Shvat */
+ switch (day)
+ {
+ // The info for figuring out Shabbat Shirah is from the Gnu code. I
+ // assume it's correct.
+// static char *song = i18n("Sh. Shirah";
+ case 10:
+ if ((kvia != 0) && shabbat_p)
+ holidays << i18n("Sh. Shirah");
+ break;
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 16:
+ if (shabbat_p)
+ holidays << i18n("Sh. Shirah");
+ break;
+ case 15:
+ if (shabbat_p)
+ holidays << i18n("Sh. Shirah");
+ holidays << i18n("Tu B'Shvat");
+ case 17:
+ if ((kvia == 0) && shabbat_p)
+ holidays << i18n("Sh. Shirah");
+ break;
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ case 30:
+ // The last shabbat on or before 1 Adar or 1 AdarII
+ if (shabbat_p && !leap_year_p)
+ holidays << i18n("Sh. Shekalim");
+ break;
+ }
+ break;
+
+ case 12: /* Adar I */
+ if (day == 14)
+ // Eat Purim Katan Candy
+ holidays << i18n("Purim Katan");
+ else if ((day >= 25) && shabbat_p)
+ // The last shabbat on or before 1 Adar II.
+ holidays << i18n("Sh. Shekalim");
+ break;
+
+ case 13: /* Adar II or Adar */
+ switch (day)
+ {
+ case 1:
+ if (shabbat_p)
+ holidays << i18n("Sh. Shekalim");
+ break;
+ case 11:
+ case 12:
+ // Ta'anit ester is on the 13th. But shabbat moves it back to
+ // Thursday.
+ if (weekday == Thursday)
+ holidays << i18n("Ta'anit Ester");
+ /* Fall thru */
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ // The Shabbat before purim is Shabbat Zachor
+ if (shabbat_p)
+ holidays << i18n("Sh. Zachor");
+ break;
+ case 13:
+ if (shabbat_p)
+ holidays << i18n("Sh. Zachor");
+ else
+ holidays << i18n("Erev Purim");
+ // It's Ta'anit Esther, unless it's a Friday or Saturday
+ if (weekday < Friday)
+ holidays << i18n("Ta'anit Ester");
+ break;
+ case 14:
+ holidays << i18n("Purim");
+ break;
+ case 15:
+ if (!shabbat_p)
+ holidays << i18n("Shushan Purim");
+ break;
+ case 16:
+ if (weekday == 1)
+ holidays << i18n("Shushan Purim");
+ break;
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ case 22:
+ case 23:
+ if (shabbat_p)
+ holidays << i18n("Sh. Parah");
+ break;
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ if (shabbat_p)
+ holidays << i18n("Sh. HaHodesh");
+ break;
+ }
+ break;
+ }
+ if (shabbat_p && ParshaP)
+ // Find the Parsha on Shabbat.
+ holidays << Parsha::FindParshaName(day_number, kvia, leap_year_p,
+ israel_p);
+ return holidays;
+}
+
+/* Return a string corresponding to the nth day of the Omer */
+QString Holiday::Sfirah(int day)
+{
+ /*static char buffer[40];
+ char *endings[] = {"th", "st", "nd", "rd"};
+ int remainder = day % 10;
+ // 11-19 and anything not ending with 1, 2, or 3 uses -th as suffix.
+ if ( ((day >= 11) && (day <= 19)) || (remainder > 3)) remainder = 0;
+ sprintf(buffer, "%d%s day Omer", day, endings[remainder]);
+ return buffer; */
+ QString buffer;
+
+ buffer.setNum(day);
+ buffer + i18n(" Omer"); // Fix this to original function
+ return buffer;
+
+}