#!/usr/bin/env python # -*- coding: utf-8 -*- """ republical.py - French Republican Calendar Author: Sean B. Palmer, inamidst.com """ import math, datetime, calendar names = ['Raisin', 'Safran', 'Châtaigne', 'Colchique', 'Cheval', 'Balsamine', 'Carotte', 'Amarante', 'Panais', 'Cuve', 'Pomme de terre', 'Immortelle', 'Potiron', 'Réséda', 'Âne', 'Belle de nuit', 'Citrouille', 'Sarrasin', 'Tournesol', 'Pressoir', 'Chanvre', 'Pêche', 'Navet', 'Amaryllis', 'Boeuf', 'Aubergine', 'Piment', 'Tomate', 'Orge', 'Tonneau', 'Pomme', 'Céleri', 'Poire', 'Betterave', 'Oie', 'Héliotrope', 'Figue', 'Scorsonère', 'Alisier', 'Charrue', 'Salsifis', 'Macre', 'Topinambour', 'Endive', 'Dindon', 'Chervis', 'Cresson', 'Dentelaire', 'Grenade', 'Herse', 'Bacchante', 'Azerole', 'Garance', 'Orange', 'Faisan', 'Pistache', 'Macjonc', 'Coing', 'Cormier', 'Rouleau', 'Raiponce', 'Turneps', 'Chicorée', 'Nèfle', 'Cochon', 'Mâche', 'Chou-fleur', 'Miel', 'Genièvre', 'Pioche', 'Cire', 'Raifort', 'Cèdre', 'Sapin', 'Chevreuil', 'Ajonc', 'Cyprès', 'Lierre', 'Sabine', 'Hoyau', 'Erable sucré', 'Bruyère', 'Roseau', 'Oseille', 'Grillon', 'Pignon', 'Liège', 'Truffe', 'Olive', 'Pelle', 'Tourbe', 'Houille', 'Bitume', 'Soufre', 'Chien', 'Lave', 'Terre végétale', 'Fumier', 'Salpêtre', 'Fléau', 'Granit', 'Argile', 'Ardoise', 'Grès', 'Lapin', 'Silex', 'Marne', 'Pierre à chaux', 'Marbre', 'Van', 'Pierre à plâtre', 'Sel', 'Fer', 'Cuivre', 'Chat', 'Étain', 'Plomb', 'Zinc', 'Mercure', 'Crible', 'Lauréole', 'Mousse', 'Fragon', 'Perce-neige', 'Taureau', 'Laurier-thym', 'Amadouvier', 'Mézéréon', 'Peuplier', 'Coignée', 'Ellébore', 'Brocoli', 'Laurier', 'Avelinier', 'Vache', 'Buis', 'Lichen', 'If', 'Pulmonaire', 'Serpette', 'Thlaspi', 'Thimelé', 'Chiendent', 'Trainasse', 'Lièvre', 'Guède', 'Noisetier', 'Cyclamen', 'Chélidoine', 'Traîneau', 'Tussilage', 'Cornouiller', 'Violier', 'Troène', 'Bouc', 'Asaret', 'Alaterne', 'Violette', 'Marceau', 'Bêche', 'Narcisse', 'Orme', 'Fumeterre', 'Vélar', 'Chèvre', 'Épinard', 'Doronic', 'Mouron', 'Cerfeuil', 'Cordeau', 'Mandragore', 'Persil', 'Cochléaria', 'Pâquerette', 'Thon', 'Pissenlit', 'Sylve', 'Capillaire', 'Frêne', 'Plantoir', 'Primevère', 'Platane', 'Asperge', 'Tulipe', 'Poule', 'Bette', 'Bouleau', 'Jonquille', 'Aulne', 'Couvoir', 'Pervenche', 'Charme', 'Morille', 'Hêtre', 'Abeille', 'Laitue', 'Mélèze', 'Ciguë', 'Radis', 'Ruche', 'Gainier', 'Romaine', 'Marronnier', 'Roquette', 'Pigeon', 'Lilas', 'Anémone', 'Pensée', 'Myrtille', 'Greffoir', 'Rose', 'Chêne', 'Fougère', 'Aubépine', 'Rossignol', 'Ancolie', 'Muguet', 'Champignon', 'Hyacinthe', 'Râteau', 'Rhubarbe', 'Sainfoin', 'Bâton-d\'or', 'Chamérops', 'Ver à soie', 'Consoude', 'Pimprenelle', 'Corbeille d\'or', 'Arroche', 'Sarcloir', 'Statice', 'Fritillaire', 'Bourrache', 'Valériane', 'Carpe', 'Fusain', 'Civette', 'Buglosse', 'Sénevé', 'Houlette', 'Luzerne', 'Hémérocalle', 'Trèfle', 'Angélique', 'Canard', 'Mélisse', 'Fromental', 'Martagon', 'Serpolet', 'Faux', 'Fraise', 'Bétoine', 'Pois', 'Acacia', 'Caille', 'Oeillet', 'Sureau', 'Pavot', 'Tilleul', 'Fourche', 'Barbeau', 'Camomille', 'Chèvrefeuille', 'caille-lait', 'Tanche', 'Jasmin', 'Verveine', 'Thym', 'Pivoine', 'Chariot', 'Seigle', 'Avoine', 'Oignon', 'Véronique', 'Mulet', 'Romarin', 'Concombre', 'Echalote', 'Absinthe', 'Faucille', 'Coriandre', 'Artichaut', 'Girofle', 'Lavande', 'Chamois', 'Tabac', 'Groseille', 'Gesse', 'Cerise', 'Parc', 'Menthe', 'Cumin', 'Haricot', 'Orcanète', 'Pintade', 'Sauge', 'Ail', 'Vesce', 'Blé', 'Chalémie', 'Epeautre', 'Bouillon blanc', 'Melon', 'Ivraie', 'Bélier', 'Prêle', 'Armoise', 'Carthame', 'Mûre', 'Arrosoir', 'Panis', 'Salicorne', 'Abricot', 'Basilic', 'Brebis', 'Guimauve', 'Lin', 'Amande', 'Gentiane', 'Ecluse', 'Carline', 'Câprier', 'Lentille', 'Aunée', 'Loutre', 'Myrte', 'Colza', 'Lupin', 'Coton', 'Moulin', 'Prune', 'Millet', 'Lycoperdon', 'Escourgeon', 'Saumon', 'Tubéreuse', 'Sucrion', 'Apocyn', 'Réglisse', 'Echelle', 'Pastèque', 'Fenouil', 'Epine vinette', 'Noix', 'Truite', 'Citron', 'Cardère', 'Nerprun', 'Tagette', 'Hotte', 'Eglantine', 'Noisette', 'Houblon', 'Sorgho', 'Ecrevisse', 'Bigarade', 'Verge d\'or', 'Maïs', 'Marron', 'Panier'] # - http://en.wikipedia.org/wiki/French_Republican_Calendar#Days_of_the_year # * * * coding = zip( [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] ) def roman(num): if num <= 0 or num >= 4000 or int(num) != num: raise ValueError('Input must be an integer between 1 and 3999') result = [] for d, r in coding: while num >= d: result.append(r) num -= d return ''.join(result) # - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/415384 # code by Raymond Hettinger # * * * today = datetime.date.today() def first(): """Calculate the FRC New Year's Day for this year""" if (today.month < 9) or ((today.month == 9) and (today.day < 22)): return datetime.date(year=today.year - 1, month=9, day=22) else: return datetime.date(year=today.year, month=9, day=22) def yearday(start): current = start oneday = datetime.timedelta(days=1) day = 1 while True: if current == today: break current = current + oneday day += 1 return day def dayname(day): if day <= 360: return names[day - 1] elif 361 <= day <= 366: return { 361: 'La Fête de la Vertu', 362: 'La Fête du Génie', 363: 'La Fête du Travail', 364: 'La Fête de l\'Opinion', 365: 'La Fête des Récompenses', 366: 'La Fête de la Révolution' }[day] # if calendar.isleap(start.year + 1): # print 'leap' def monthname(day): month = int(math.floor((float(day) - 1) / 30)) if 1 <= day <= 360: return [ 'Vendémiaire', 'Brumaire', 'Frimaire', 'Nivôse', 'Pluviôse', 'Ventôse', 'Germinal', 'Floréal', 'Prairial', 'Messidor', 'Thermidor', 'Fructidor' ][month] elif 361 <= day <= 366: return None def yearname(start): return roman(start.year - 1791) def main(): start = first() day = yearday(start) d = dayname(day) m = monthname(day) y = yearname(start) if day < 361: print '%s, %s %s (Romme)' % (d, m, y) else: print '%s, %s (Romme)' % (d, y) if __name__ == '__main__': main()