From ee3094c83bd2e165d0bd3084867e0973af322e15 Mon Sep 17 00:00:00 2001 From: Andrea Rigoni Date: Sun, 10 Dec 2023 15:57:44 +0100 Subject: [PATCH] Initial commit --- calendario_dei_santi.inx | 94 ++++++++ calendario_dei_santi.py | 469 +++++++++++++++++++++++++++++++++++++++ santi.xlsx | Bin 0 -> 33524 bytes 3 files changed, 563 insertions(+) create mode 100644 calendario_dei_santi.inx create mode 100755 calendario_dei_santi.py create mode 100644 santi.xlsx diff --git a/calendario_dei_santi.inx b/calendario_dei_santi.inx new file mode 100644 index 0000000..fd24696 --- /dev/null +++ b/calendario_dei_santi.inx @@ -0,0 +1,94 @@ + + + CalendarioDeiSanti + com.calendario_dei_santi + calendario_dei_santi.py + + + + 0 + 0 + + px + mm + + + + + + Apple Garamond + 1970 + + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + Agosto + Settembre + Ottobre + Novembre + Dicembre + + 1 + 31 + + 1 + 500 + 12 + + + + + + 16 + 10 + 0 + 0 + 0 + 0 + + + + 14 + 0 + 0 + 0 + 0 + 0 + + + + + + 9 + 0 + 0 + 0 + 0 + 0 + + + + 21 + 0 + 0 + 0 + 0 + 0 + + + + + + all + + + + + + diff --git a/calendario_dei_santi.py b/calendario_dei_santi.py new file mode 100755 index 0000000..32e4e7d --- /dev/null +++ b/calendario_dei_santi.py @@ -0,0 +1,469 @@ +#! /usr/bin/python +''' +Copyright (C) 2017 Artem Synytsyn a.synytsyn@gmail.com + +#TODO: Code cleaning and refactoring + +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. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +''' + +import inkex +import sys +from lxml import etree +from math import * + + +import re +from typing import Any +import wikipedia +import openpyxl + + +import math, decimal, datetime +dec = decimal.Decimal + + +## __ ___ _ _ ____ _ _ +## \ \ / (_) | _(_) ___| __ _(_)_ __ | |_ ___ +## \ \ /\ / /| | |/ / \___ \ / _` | | '_ \| __/ __| +## \ V V / | | <| |___) | (_| | | | | | |_\__ \ +## \_/\_/ |_|_|\_\_|____/ \__,_|_|_| |_|\__|___/ +## + + +class WikiSaints: + + def __init__(self, get_from_wiki=False): + if get_from_wiki: + self.saints_per_month = self.get_data() + else: + self.saints_per_month = {} + self.it_month_name = [ "Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"] + + + def get_data(self): + wikipedia.set_lang("it") + lines = wikipedia.page('Calendario_dei_santi').content.split('\n') + # print(lines) + reg = re.compile(r'(==)*(==)') + cat = {} + month_name = self.it_month_name + month_strg = [ "== "+m+" ==" for m in month_name] + d = None + for n,l in enumerate(lines): + if reg.search(l): + cat[l] = [] + d = cat[l] + elif d is not None: + d.append(l) + + clean_cat = {} + for m in month_name: + clean_cat[m] = cat[f"== {m} =="] + return clean_cat + + def save(self, file_name): + wb = openpyxl.Workbook(file_name) + + for k,data in self.saints_per_month.items(): + ws = wb.create_sheet(k) + # add column headings. NB. these must be strings + ws.append(["Giorno", "Santo", "altri santi"]) + for i,s in enumerate(data): + try: + g = s.split(":")[0] + S = s.split(":")[1].split(";")[0] + o = s.split(":")[1].split(";")[1] + except: + g = S = o = "" + ws.append([i+1, S, o]) + + wb.save(file_name) + + def open(self, file_name): + wb = openpyxl.open(file_name) + + for ws in wb.worksheets: + self.saints_per_month[ws.title] = [] + for i,row in enumerate(ws.rows): + if i==0: continue # skip header + elements = [ el.value for el in row][1:] + if len(elements) and elements[0] is not None: + self.saints_per_month[ws.title].append(elements) + + def print_month(self, month: str): + try: + m = self.saints_per_month[month] + for i,el in enumerate(m): + print(i+1, el) + except: + pass + + def get_saint(self, month : str, day: int): + try: + return self.saints_per_month[month][day-1] + except: + return None + + def get_date(self, day : int, month : str, year : int = None) -> str : + if year is None: year = datetime.date.today().year + month = self.it_month_name.index(month) + return datetime.date(year, month+1, day) + + def get_weekday(self, date) -> str : + wday = date.weekday() + it_wday = [ + 'Lunedì', + 'Martedì', + 'Mercoledì', + 'Giovedì', + 'Venerdì', + 'Sabato', + 'Domenica' + ] + it_wday_short = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'] + return it_wday[wday] + + def get_moon_position(self, date=None): + if date is None: + date = datetime.date.today() + diff = date - datetime.date(2001, 1, 1) + days = dec(diff.days) + (dec(diff.seconds) / dec(86400)) + lunations = dec("0.20439731") + (days * dec("0.03386319269")) + return lunations % dec(1) + + def get_moon_phase(self, date=None, phases=4): + index = ((self.get_moon_position(date)+dec(0.26))%dec(1) * dec(phases))# + dec("0.5") + if index - math.floor(index) < phases/30: + index = math.floor(index) + return int(index) + else: + return None + + def _get_easter(self, year): + """ + Use easter date algorithm to calculate the day of easter for a given year. + If the year given is in a special range(special_years) then subtract 7 from the final date. + + return easter as offset from March 1 -> goes in April if day > 31 + """ + + special_years = ['1954', '1981', '2049', '2076'] + specyr_sub = 7 + a = year % 19 + b = year % 4 + c = year % 7 + d = (19 * a + 24) % 30 + e = ((2 * b) + (4 * c) + (6 * d) + 5) % 7 + + if year in special_years: + dateofeaster = (22 + d + e) - specyr_sub + else: + dateofeaster = 22 + d + e + return dateofeaster + + def get_mobile_fest(self, date): + """ + ### https://it.cathopedia.org/wiki/Calcolo_delle_feste_mobili_legate_alla_Pasqua + """ + mobile_fests = { + 'easter' : "Resurrezione del Signore", + 'mc' : "Mercoledì delle Ceneri", # -46 + 'dc' : "Domenica delle Palme", # -7 + 'as' : "Ascensione di nostro Signore", # 42 + 'cd' : "Solennità del Corpus Domini", # 63 (dal 1978) + 'cr' : "Festa del Ctristo Re", # prima di avvento ( metti a mano ) + } + # easter + eday = self._get_easter(date.year) + emonth = 3 + if eday > 31: + eday -= 31 + emonth = 4 + easter = datetime.date(date.year, emonth, eday) + if date == easter: return mobile_fests['easter'] + if date == easter - datetime.timedelta(days=46): return mobile_fests['mc'] # mercoledi delle ceneri + if date == easter - datetime.timedelta(days=7): return mobile_fests['dc'] # domenica delle palme + if date == easter + datetime.timedelta(days=42): return mobile_fests['as'] # ascensione + if date == easter + datetime.timedelta(days=63): return mobile_fests['cd'] # corpus domini + + + # AVVENTO ( da rifare ) + # xm = datetime.date(date.year, 12, 25) + # a4 = xm - datetime.timedelta(days=7) + # a3 = a4 - datetime.timedelta(days=7) + # a2 = a3 - datetime.timedelta(days=7) + # a1 = a2 - datetime.timedelta(days=7) + # if date == a1: return mobile_fests['a1'] + # if date == a2: return mobile_fests['a2'] + # if date == a3: return mobile_fests['a3'] + # if date == a4: return mobile_fests['a4'] + + return None + + + + +## ____ _ _ _ ____ _ _ +## / ___|__ _| | ___ _ __ __| | __ _ _ __(_) ___/ ___| __ _ _ __ | |_(_) +## | | / _` | |/ _ \ '_ \ / _` |/ _` | '__| |/ _ \___ \ / _` | '_ \| __| | +## | |__| (_| | | __/ | | | (_| | (_| | | | | (_) |__) | (_| | | | | |_| | +## \____\__,_|_|\___|_| |_|\__,_|\__,_|_| |_|\___/____/ \__,_|_| |_|\__|_| +## + +class _Spacing(): + size = 0. + padding = 0. + margin_top = 0. + margin_bottom = 0. + margin_left = 0. + margin_right = 0. + +class CalendarioSanti(inkex.Effect): + def __init__(self): + inkex.Effect.__init__(self) + + # General settings + self.arg_parser.add_argument("--x", + type=float, + dest="x", default=0.0, + help="Center X") + self.arg_parser.add_argument("--y", + type=float, + dest="y", default=0.0, + help="Center Y") + self.arg_parser.add_argument("--columnwidth", + type=float, + dest="columnwidth", default=300, + help="Calendar Column width") + self.arg_parser.add_argument("--linewidth", + type=float, + dest="linewidth", default=1, + help="day separation line width") + self.arg_parser.add_argument("--rowheight", + type=float, + dest="rowheight", default=12, + help="row height") + self.arg_parser.add_argument("-u", "--units", + type=str, + dest="units", default="mm", + help="units to measure size of knob") + + # Dummy + self.arg_parser.add_argument("--tab") + + # Label settings + self.arg_parser.add_argument("--saints_file", + type=str, + dest="saints_file", default='', + help="xlsx file to load saints") + self.arg_parser.add_argument("--font_family", + type=str, + dest="font_family", default="Apple Garamond", + help="Font family to use for days and labels") + self.arg_parser.add_argument("--year", + type=int, + dest="year", default=1970, + help="Calendar Year") + self.arg_parser.add_argument("-m", "--month", + type=str, + dest="month", default="Gennaio", + help="month to render") + self.arg_parser.add_argument("--dayfrom", + type=int, + dest="dayfrom", default=1, + help="Range to render day from") + self.arg_parser.add_argument("--dayto", + type=int, + dest="dayto", default=31, + help="Range to render day to") + self.arg_parser.add_argument("--day_text_size", + type=float, + dest="day_text_size", default=12, + help="Text size of day") + self.arg_parser.add_argument("--saint_text_size", + type=float, + dest="saint_text_size", default=8, + help="Text size of saint") + + # spacing + self.__elements = ['day', 'wday', 'saint', 'moon'] + self.__spacing = { + 'size' : 8, + 'padding' : 0, + 'margin-top' : 0, + 'margin-bottom' : 0, + 'margin-left' : 0, + 'margin-right' : 0 + } + for el in self.__elements: + for sk in self.__spacing.keys(): + sk = sk.replace('-','_') + self.arg_parser.add_argument("--" + el + "_" + sk, + type=float, + dest=el + "_" + sk, + help="Spacing " + el + " " + sk) + + + + + def draw_text(self, textvalue, pos, text_size, parent, bold=False, italic=False ): + # Create text element + x,y = pos + font = str(self.options.font_family) + font_specs = str(self.options.font_family) + if bold: font_specs += ", Bold" + else: font_specs += ", Normal" + # Center text horizontally with CSS style. + style = { + 'text-align' : 'right', + 'text-anchor': 'start', + 'alignment-baseline' : 'baseline', + 'font-family' : f"'{font}'", + '-inkscape-font-specification' : f"'{font_specs}'", + 'font-weight' : 'bold' if bold else 'normal', + 'font-size' : str(text_size), + 'vertical-align' : 'middle' + } + + attribs = {'style' : str(inkex.Style(style)), + 'x' : str(x), 'y' : str(y), 'text' : str(textvalue) } + + text = etree.SubElement(parent, inkex.addNS('text','svg'), attribs ) + text.text = textvalue + text.set('style', str(inkex.Style(style))) + # parent.append(text) + return text + + + def draw_moon_text(self, phase, pos, text_size, parent): + moon_phase = "○◑●◐" + textvalue = moon_phase[(phase+1)%4] + return self.draw_text(textvalue, pos, text_size, parent) + + + def draw_hline(self, pos, length, parent): + x1,y1 = pos + x2,y2 = pos[0] + length, pos[1] + + line_style = { 'stroke': '#000000', + 'stroke-width': str(self.spacing['linewidth']), + 'fill': 'none' + } + + line_attribs = {'style' : str(inkex.Style(line_style)), + inkex.addNS('label','inkscape') : "none", + 'd' : 'M '+str(x1) +',' + + str(y1) +' L '+str(x2) + +','+str(y2) } + + line = etree.SubElement(parent, inkex.addNS('path','svg'), line_attribs ) + return line + + + def draw_day(self, cal_date, pos, parent, fest = False): + date = self._wss.get_date(cal_date['day'], cal_date['month'], cal_date['year']) + bold = date.weekday() == 6 # Domenica + + # import feste fisse da Excel + if cal_date['fest'] != 'None': + fest = True + saint_textvalue = cal_date['fest'] if fest else str(cal_date['saint']) + + # calcolo feste mobili + mobile_fest = self._wss.get_mobile_fest(date) + if mobile_fest is not None: + fest = True + saint_textvalue += " - " + mobile_fest + + if fest: bold = True + + wday = self._wss.get_weekday(date) + mphs = self._wss.get_moon_phase(date) + day_text = self.draw_text(str(cal_date['day']), pos['day'], self.spacing['day'].size, parent, bold=bold) + wdl_text = self.draw_text(str(wday), pos['wday'], self.spacing['wday'].size, parent, bold=bold) + ssn_text = self.draw_text(saint_textvalue, pos['saint'], self.spacing['saint'].size, parent, bold=bold) + if mphs is not None: + mph_text = self.draw_moon_text( mphs, pos['moon'], self.spacing['moon'].size, parent) + h_line = self.draw_hline( pos['hline'], self.spacing['columnwidth'],parent) + pass + + def _compute_spacing(self, x, y, it): + d = self.spacing['day'] + w = self.spacing['wday'] + s = self.spacing['saint'] + m = self.spacing['moon'] + dbb = 1.5*d.size + 2*d.padding + d.margin_left + d.margin_right, \ + d.size + 2*d.padding + d.margin_top + d.margin_bottom + sby = s.size + 2*s.padding + s.margin_top + s.margin_bottom + wby = w.size + 2*w.padding + w.margin_top + w.margin_bottom + + lw = self.spacing['linewidth'] + cw = self.spacing['columnwidth'] + rh = self.spacing['rowheight'] + y = y + max(rh, dbb[1]+lw) * it + + ans = { + 'day' : (x+ d.padding+d.margin_left , y+ dbb[1]-d.padding-d.margin_bottom), + 'wday' : (x+ dbb[0] + w.padding+w.margin_left , y+ dbb[1]-sby-w.padding-w.margin_bottom), + 'saint': (x+ dbb[0] + s.padding+s.margin_left , y+ dbb[1]-s.padding-s.margin_bottom), + 'hline': (x , y+ dbb[1]), + 'moon' : (x + cw - m.size-2*m.padding-m.margin_right, y+ m.size+2*m.padding+m.margin_top), + } + return ans + + def effect(self): + + parent = self.svg.get_current_layer() + selected = self.svg.selected + + if selected: + bbox = selected.bounding_box() + self.x_offset = bbox.left + self.y_offset = bbox.top + else: + self.x_offset = self.svg.unittouu(str(self.options.x) + self.options.units) + self.y_offset = self.svg.unittouu(str(self.options.y) + self.options.units) + + # populating spacing with options + self.spacing = {} + for el in self.__elements: + self.spacing[el] = _Spacing() + for sk in self.__spacing.keys(): + sk = sk.replace('-','_') + self.spacing[el].__dict__[sk] = self.svg.unittouu( str(getattr(self.options ,el+'_'+sk)) + self.options.units) + self.spacing['linewidth'] = getattr(self.options ,'linewidth') + self.spacing['columnwidth'] = self.svg.unittouu( str(getattr(self.options ,'columnwidth')) + self.options.units) + self.spacing['rowheight'] = self.svg.unittouu( str(getattr(self.options ,'rowheight')) + self.options.units) + + if len(self.options.saints_file): + ss = WikiSaints() + ss.open(str(self.options.saints_file)) + else: + ss = WikiSaints(get_from_wiki=True) + self._wss = ss + + compute_date = lambda d: { 'day' : d, 'month' : self.options.month, 'year': self.options.year, + 'saint' : str(ss.get_saint(self.options.month, d)[0]), 'fest' : str(ss.get_saint(self.options.month, d)[2]) } + for n,d in enumerate(range(self.options.dayfrom, self.options.dayto + 1)): + cal_date = compute_date(d) + pos = self._compute_spacing(self.x_offset, self.y_offset, n) + self.draw_day(cal_date, pos, parent) + + +if __name__ == '__main__': + e = CalendarioSanti() + e.run() + diff --git a/santi.xlsx b/santi.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..05fa27c6c63cbe3b94a4097c4ac17c7b854bc846 GIT binary patch literal 33524 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 literal 0 HcmV?d00001