def init_names_auto(fname=os.path.join( os.path.dirname(os.path.dirname(__file__)), 'festival/data/period_names/translation_table.json')): """Read various nakShatra, samvatsara, mAsa and such names from a file return a dict with all of that. :returns a dict like { "YEAR_NAMES": {"hk": } ...} """ with open(fname) as f: import json names_dict = json.load(f) for dictionary in names_dict: if dictionary in ("SHUULAM", "SA_TO_TAMIL", "ARAB_MONTH_NAMES", "TIPU_ABJAD_MONTH_NAMES", "TIPU_ABTATH_MONTH_NAMES", "GRAHA_NAMES"): continue if not dictionary.startswith('VARA_NAMES'): # Vara Names follow zero indexing, rest don't names_dict[dictionary]['sa'].insert(0, 'अस्पष्टम्') names_dict[dictionary]['sa'] = { xsanscript.DEVANAGARI: names_dict[dictionary]['sa'] } for scr in scripts: names_dict[dictionary]['sa'][scr] = [ xsanscript.transliterate(name, xsanscript.DEVANAGARI, scr).title() if scr == xsanscript.IAST else xsanscript.transliterate( name, xsanscript.DEVANAGARI, scr) for name in names_dict[dictionary]['sa'][xsanscript.DEVANAGARI] ] # # new_names_dict[dictionary] = {"sa": names_dict[dictionary]['sa'][xsanscript.HK]} # with codecs.open(fname + ".new", "w") as f: # json.dump(new_names_dict, f, ensure_ascii=False, indent=2) return names_dict
def tr(text, script, titled=True): """ NOTE: Please don't put your custom tex/ md/ ics whatever code here and pollute core library functions. Wrap this in your own functions if you must. Functions should be atomic.""" if script == 'hk': script = sanscript.HK if text == '': return '' # TODO: Fix this ugliness. t = text.replace('~', '##~##') # Simple fix to prevent transliteration of ~ # logging.debug(transliterated_text) transliterated_text = sanscript.transliterate(data=t, _from=sanscript.HK, _to=script).replace( 'C', 'Ch').replace('c', 'ch') if titled: transliterated_text = transliterated_text.title() if script == sanscript.TAMIL: transliterated_text = sanscript.SCHEMES[ sanscript.TAMIL].apply_roman_numerals(transliterated_text) if script == 'iast': transliterated_text = transliterated_text.replace('ṉ', 'n') return transliterated_text
def tr(text, script, titled=True, source_script=sanscript.HK): """ NOTE: Please don't put your custom tex/ md/ ics whatever code here and pollute core library functions. Wrap this in your own functions if you must. Functions should be atomic.""" if script == 'hk': script = sanscript.HK if text == '': return '' # TODO: Fix this ugliness. t = text.replace('~', '##~##') # Simple fix to prevent transliteration of ~ transliterated_text = sanscript.transliterate(data=t, _from=source_script, _to=script).replace( 'C', 'Ch').replace('c', 'ch') if titled: transliterated_text = transliterated_text.title() if script == sanscript.TAMIL: transliterated_text = sanscript.SCHEMES[ sanscript.TAMIL].apply_roman_numerals(transliterated_text) # transliterated_text = clean_tamil_Na(transliterated_text) if script == 'iast': transliterated_text = transliterated_text.replace('ṉ', 'n') caret_accent = '̂' for _match in re.findall(caret_accent + '.', transliterated_text): transliterated_text = transliterated_text.replace( _match, _match.lower()) if script == 'telugu' or script == sanscript.TELUGU: transliterated_text = transliterated_text.replace('ऩ', 'న') return transliterated_text
def transliterate_from_language(text, language, script): if language == "ta": # Tamil names are stored in HK (because the latter differentiates between vargIya consonants!) transliterated_text = tr(text, script) else: source_script = language_code_to_script[language] transliterated_text = xsanscript.transliterate(text, source_script, script) return transliterated_text
def file_namer(row): # logging.debug(row['प्रारम्भः']) post_date = date_format_converter_us_to_yyyy_mm_dd(row['प्रारम्भः']) file_name = xsanscript.transliterate(row['लिङ्गम्'].strip(), xsanscript.DEVANAGARI, xsanscript.OPTITRANS) file_name = post_date + "_" + re.sub("[^a-zA-Z0-9\-_]", "_", file_name) + ".md" return file_name
def test_from_devanagari(test_conversions): logging.debug(str(test_conversions)) dev_string = test_conversions["dev"] for (script, text) in test_conversions.items(): if script in SCRIPT_NAME_MAP.keys(): script = SCRIPT_NAME_MAP[script] if script == "dev" or (script not in xsanscript.SCHEMES.keys()): logging.debug("Skipping over script - " + script) continue transliteration = xsanscript.transliterate(dev_string, xsanscript.DEVANAGARI, script) assert transliteration == text, "Failed to convert to " + script + " from devanAgarI. Compare: " + transliteration + " vs " + text
def get_human_names(self, fest_details_dict): from jyotisha.panchaanga.temporal.festival import rules fest_details = fest_details_dict.get( self.name, rules.HinduCalendarEvent(id=self.name)) if fest_details.names is None: sa_name = xsanscript.transliterate(self.name.replace("~", " "), sanscript.HK, sanscript.DEVANAGARI) sa_name = rules.inverse_clean_id(sa_name) fest_details.names = {"sa": [sa_name]} import copy names = copy.deepcopy(fest_details.names) return names
def tr(text, scr, titled=True): # titled = True seems to be primarily for NOT TitleCasing IAST Shlokas... if scr == 'hk': scr = sanscript.HK if text == '': return '' text = text.replace('~', '##~##') # Simple fix to prevent transliteration of ~ text_bits = text.split('|') transliterated_text = [] if titled: for t in text_bits: t = t.rstrip('#~0123456789 ') if t[:3] == 'ta:': # Force Tamil! if scr == sanscript.DEVANAGARI: scr = sanscript.TAMIL t = t[3:] if scr == sanscript.TAMIL: transliterated_text.append('\\tamil{%s}' % sanscript.transliterate(data=t, _from=sanscript.HK, _to=scr).replace('C','Ch').replace('c','ch').title()) else: transliterated_text.append( sanscript.transliterate(data=t, _from=sanscript.HK, _to=scr).replace('C','Ch').replace('c','ch').title()) else: if t.find('RIGHTarrow') == -1: transliterated_text.append( sanscript.transliterate(data=t, _from=sanscript.HK, _to=scr).replace('C','Ch').replace('c','ch').title()) else: [txt, t1, arrow, t2] = t.split('\\') transliterated_text.append( '\\'.join([sanscript.transliterate(data=txt, _from=sanscript.HK, _to=scr).replace('C','Ch').replace('c','ch').title(), t1, arrow, t2])) else: for t in text_bits: t = t.rstrip('~0123456789 ') if t[:3] == 'ta:': # Force Tamil! if scr == sanscript.DEVANAGARI: scr = sanscript.TAMIL t = t[3:] transliterated_text.append( sanscript.transliterate(data=t, _from=sanscript.HK, _to=scr).replace('C','Ch').replace('c','ch').strip("{}").title()) else: if t.find('RIGHTarrow') == -1: transliterated_text.append(sanscript.transliterate(data=t, _from=sanscript.HK, _to=scr)) else: [txt, t1, arrow, t2] = t.split('\\') transliterated_text.append( '\\'.join([sanscript.transliterate(txt, _from=sanscript.HK, _to=scr), t1, arrow, t2])) return '|'.join(transliterated_text)
def init_names_auto(fname=os.path.join(CODE_ROOT, 'names/data/translation_table_HK.json')): """Read various nakShatra, samvatsara, mAsa and such names from a file return a dict with all of that. :returns a dict like { "YEAR_NAMES": {"hk": } ...} """ with open(fname) as f: import json names_dict = json.load(f) for dictionary in names_dict: if dictionary != 'VARA_NAMES': # Vara Names follow zero indexing, rest don't names_dict[dictionary]['hk'].insert(0, '') for scr in scripts: names_dict[dictionary][scr] = [sanscript.transliterate(name, 'hk', scr).title() for name in names_dict[dictionary]['hk']] return names_dict
def get_names(fname='./names.json'): scripts = [ sanscript.DEVANAGARI, sanscript.IAST, sanscript.TAMIL, sanscript.TELUGU ] with open(fname) as f: names_dict = json.load(f) for dictionary in names_dict: if dictionary != 'VARA_NAMES': # Vara Names follow zero indexing, rest don't names_dict[dictionary]['hk'].insert(0, 'aspaShTam') for scr in scripts: names_dict[dictionary][scr] = [ sanscript.transliterate(name, 'hk', scr) for name in names_dict[dictionary]['hk'] ] return names_dict
def get_description_str_with_shlokas(include_shlokas, rule, script): # Get the description description_string = '' descriptions = {} if rule.description is not None: # description_string = json.dumps(rule.description) for language in rule.description: if language == "en": descriptions["en"] = get_english_description(description_string, rule) else: descriptions[language] = rule.description[language] description_items = sorted(descriptions.items(), key=lambda pair: ["en", "sa", "ta"].index(pair[0])) description_string = "\n\n".join([x[1].strip() for x in description_items]) if rule.shlokas is not None and include_shlokas: shlokas = xsanscript.transliterate(rule.shlokas.strip().replace("\n", " \n"), xsanscript.DEVANAGARI, script) description_string = description_string + '\n\n' + shlokas + '\n\n' return description_string
def to_hour_text(self, tz, script=xsanscript.IAST, reference_date=None): if self.jd_start is not None: start_time = '%s' % default_if_none( tz.julian_day_to_local_time( julian_day=self.jd_start).get_hour_str( reference_date=reference_date), "") else: start_time = '' if self.jd_end is not None: end_time = '%s' % default_if_none( tz.julian_day_to_local_time( julian_day=self.jd_end).get_hour_str( reference_date=reference_date), "") else: end_time = '' hour_text = "%s►%s" % (start_time, end_time) return xsanscript.transliterate(hour_text, _from=xsanscript.IAST, _to=script)
def get_description_dict(self, script): from jyotisha.panchaanga.temporal.festival.rules import summary description_dict = {} description_dict['blurb'] = summary.get_timing_summary(self) description_dict[ 'detailed'] = summary.get_description_str_with_shlokas( False, self, script) if self.image is None: description_dict['image'] = '' else: description_dict['image'] = self.image description_dict['references'] = summary.get_references_md(self) if self.shlokas is not None: description_dict['shlokas'] = xsanscript.transliterate( self.shlokas.replace("\n", " \n"), xsanscript.DEVANAGARI, script) else: description_dict['shlokas'] = '' return description_dict
with open(os.path.join(CODE_ROOT, 'panchangam/data/kanchi_aradhana_rules.json')) as aradhana_data: aradhana_rules = json.load(aradhana_data, object_pairs_hook=OrderedDict) for script in [sanscript.DEVANAGARI, sanscript.IAST]: with open(os.path.join(CODE_ROOT, 'kanchi_aradhana_days_%s.md' % script), 'w') as f: f.write('## Sri Kanchi Matham Guru Aaradhana Days\n\n') f.write('(obtained from [kamakoti.org](http://kamakoti.org/peeth/origin.html#appendix2), ') f.write('and corrected using [@kamakoti twitter feed](https://twitter.com/kamakoti)!)\n\n') f.write('| # | Jagadguru | Mukti Year (Kali) | Mukti Year Name | Month | Tithi |\n') f.write('| - | --------- | ----------------- | --------------- | ----- | ----- |\n') for guru in aradhana_rules.keys(): if guru[:5] == 'kAJcI': name = str(' '.join(guru.split()[3:-1])).replace('-', ' ') num = int(guru.split()[1]) kali_year = str(aradhana_rules[guru]['Start Year'] - 1) year_name = NAMES['YEAR_NAMES']['hk'][((int(kali_year) + 12) % 60)] else: name = guru[:-9] num = '-' kali_year = '-' year_name = '-' tithi = NAMES['TITHI_NAMES']['hk'][aradhana_rules[guru]['Angam Number']-1] month_name = "UNKNOWN" if aradhana_rules[guru]['Month Type'] == 'lunar_month': month_name = NAMES['CHANDRA_MASA_NAMES']['hk'][aradhana_rules[guru]['Month Number']-1] elif aradhana_rules[guru]['Month Type'] == 'solar_month': month_name = NAMES['MASA_NAMES']['hk'][aradhana_rules[guru]['Month Number']-1] f.write('| %s | %s | %s | %s | %s | %s |\n' % (num, sanscript.transliterate(name, sanscript.HK, script).title(), kali_year, sanscript.transliterate(year_name, sanscript.HK, script), sanscript.transliterate(month_name, sanscript.HK, script), tithi.replace('-', ' ')))
def compute_calendar(panchangam): festival_rules_main = read_old_festival_rules_dict(os.path.join(CODE_ROOT, 'panchangam/data/festival_rules.json')) festival_rules_rel = read_old_festival_rules_dict(os.path.join(CODE_ROOT, 'panchangam/data/relative_festival_rules.json')) festival_rules_desc_only = read_old_festival_rules_dict(os.path.join(CODE_ROOT, 'panchangam/data/festival_rules_desc_only.json')) festival_rules = {**festival_rules_main, **festival_rules_rel, **festival_rules_desc_only} ics_calendar = Calendar() # uid_list = [] alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(hours=-4)) # default alarm, with a 4 hour reminder for d in range(1, jyotisha.panchangam.temporal.MAX_SZ - 1): [y, m, dt, t] = swe.revjul(panchangam.jd_start + d - 1) if len(panchangam.festivals[d]) > 0: # Eliminate repeat festivals on the same day, and keep the list arbitrarily sorted panchangam.festivals[d] = sorted(list(set(panchangam.festivals[d]))) summary_text = panchangam.festivals[d] # this will work whether we have one or more events on the same day for stext in sorted(summary_text): desc = '' event = Event() if stext == 'kRttikA-maNDala-pArAyaNam': event.add('summary', jyotisha.custom_transliteration.tr(stext.replace('-', ' '), panchangam.script)) fest_num_loc = stext.find('~\#') if fest_num_loc != -1: stext = stext[:fest_num_loc] event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(48)).date()) if stext in festival_rules: desc = festival.HinduCalendarEventOld.make_from_dict(festival_rules[stext]).get_description_string(script=panchangam.script, include_url=True) else: logging.warning('No description found for festival %s!' % stext) event.add_component(alarm) event.add('description', desc.strip()) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) elif stext.find('RIGHTarrow') != -1: # It's a grahanam/yogam, with a start and end time if stext.find('{}') != -1: # Starting or ending time is empty, e.g. harivasara, so no ICS entry continue [stext, t1, arrow, t2] = stext.split('\\') stext = stext.strip('-~') event.add('summary', jyotisha.custom_transliteration.tr(stext, panchangam.script)) # we know that t1 is something like 'textsf{hh:mm(+1)}{' # so we know the exact positions of min and hour if t1[12] == '(': # (+1), next day event.add('dtstart', datetime(y, m, dt, int(t1[7:9]), int(t1[10:12]), tzinfo=tz(panchangam.city.timezone)) + timedelta(1)) else: event.add('dtstart', datetime(y, m, dt, int(t1[7:9]), int(t1[10:12]), tzinfo=tz(panchangam.city.timezone))) if t2[12] == '(': # (+1), next day event.add('dtend', datetime(y, m, dt, int(t2[7:9]), int(t2[10:12]), tzinfo=tz(panchangam.city.timezone)) + timedelta(1)) else: event.add('dtend', datetime(y, m, dt, int(t2[7:9]), int(t2[10:12]), tzinfo=tz(panchangam.city.timezone))) if stext in festival_rules: festival_event = festival.HinduCalendarEventOld.make_from_dict(festival_rules[stext]) desc = festival_event.get_description_string(script=panchangam.script, include_url=True) else: logging.warning('No description found for festival %s!\n' % stext) event.add('description', desc.strip()) event.add_component(alarm) ics_calendar.add_component(event) elif stext.find('samApanam') != -1: # It's an ending event event.add('summary', jyotisha.custom_transliteration.tr(stext, panchangam.script)) event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) if stext in festival_rules: festival_event = festival.HinduCalendarEventOld.make_from_dict(festival_rules[stext]) desc = festival_event.get_description_string(script=panchangam.script, include_url=True) else: logging.warning('No description found for festival %s!' % stext) event.add_component(alarm) event.add('description', desc.strip()) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) # Find start and add entire event as well event = Event() check_d = d stext_start = stext.replace('samApanam', 'ArambhaH') start_d = None while check_d > 1: check_d -= 1 if stext_start in panchangam.festivals[check_d]: start_d = check_d break if start_d is None: logging.error('Unable to find start date for %s' % stext_start) else: # logging.debug(stext) event_summary_text = stext REPLACEMENTS = {'samApanam': '', 'rAtri-': 'rAtriH', 'nakSatra-': 'nakSatram', 'pakSa-': 'pakSaH', 'puSkara-': 'puSkaram', 'dIpa-': 'dIpaH', 'snAna-': 'snAnam', 'tsava-': 'tsavaH', 'vrata-': 'vratam'} for _orig, _repl in REPLACEMENTS.items(): event_summary_text = event_summary_text.replace(_orig, _repl) event.add('summary', jyotisha.custom_transliteration.tr(event_summary_text, panchangam.script)) event.add('dtstart', (datetime(y, m, dt) - timedelta(d - start_d)).date()) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) # print(event) event.add_component(alarm) event.add('description', desc.strip()) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) else: summary = jyotisha.custom_transliteration.tr(stext.replace('~', ' ').replace('\#', '#').replace('\\To{}', '▶'), panchangam.script) summary = re.sub('.tamil{(.*)}', '\\1', summary) summary = re.sub('{(.*)}', '\\1', summary) # strip braces around numbers event.add('summary', summary) fest_num_loc = stext.find('~\#') if fest_num_loc != -1: stext = stext[:fest_num_loc] event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) if re.match('.*-.*-EkAdazI', stext) is None and stext.find('saGkrAntiH') == -1: if stext in festival_rules: desc = festival.HinduCalendarEventOld.make_from_dict(festival_rules[stext]).get_description_string(script=panchangam.script, include_url=True) else: if re.match('aGgArakI.*saGkaTahara-caturthI-vratam', stext): stext = stext.replace('aGgArakI~', '') if stext in festival_rules: desc = festival.HinduCalendarEventOld.make_from_dict(festival_rules[stext]).get_description_string(script=panchangam.script) desc += 'When `caturthI` occurs on a Tuesday, it is known as `aGgArakI` and is even more sacred.' else: logging.warning('No description found for caturthI festival %s!' % stext) else: logging.warning('No description found for festival %s!' % stext) elif stext.find('saGkrAntiH') != -1: # Handle Sankranti descriptions differently planet_trans = stext.split('~')[0] # get rid of ~(rAshi name) etc. if planet_trans in festival_rules: desc = festival.HinduCalendarEventOld.make_from_dict(festival_rules[planet_trans]).get_description_string(script=panchangam.script, include_url=True) else: logging.warning('No description found for festival %s!' % planet_trans) else: # logging.debug(stext) # Handle ekadashi descriptions differently ekad = '-'.join(stext.split('-')[1:]) # get rid of sarva etc. prefix! if ekad in festival_rules: desc = festival.HinduCalendarEventOld.make_from_dict(festival_rules[ekad]).get_description_string(script=panchangam.script, include_url=True) else: logging.warning('No description found for Ekadashi festival %s (%s)!' % (ekad, stext)) pref = jyotisha.custom_transliteration.romanise(sanscript.transliterate( stext.split('-')[0], sanscript.HK, sanscript.IAST)) + "-" event.add_component(alarm) event.add('description', desc.strip()) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) if m == 12 and dt == 31: break return ics_calendar
from indic_transliteration import xsanscript as sanscript from jyotisha.panchaanga.temporal.names.init_names_auto import init_names_auto logging.basicConfig( level=logging.DEBUG, format="%(levelname)s: %(asctime)s {%(filename)s:%(lineno)d}: %(message)s " ) if __name__ == '__main__': NAMES = init_names_auto() # TODO: Verify the below. with open('README.md', 'w') as f: for anga in NAMES: f.write('## ' + anga + '\n') f.write('(as initialised from `init_names_auto.py`)\n\n') f.write('| # | ' + ' | '.join(sorted(list(NAMES[anga]['sa'].keys()))) + ' |\n') f.write('|---| ' + ' | '.join(['-' * len(scr) for scr in sorted(list(NAMES[anga]['sa'].keys()))]) + ' |\n') if anga == 'VARA_NAMES': amin = 0 # min anga for VARA alone is 0, rest 1 else: amin = 1 for num in range(amin, len(NAMES[anga]['sa']['hk'])): line = '| %d' % (num) for script in sorted(list(NAMES[anga]['sa'].keys())): line += ' | ' + sanscript.transliterate(NAMES[anga]['sa']['hk'][num], sanscript.HK, script) f.write(line + ' |\n') f.write('\n\n')
sys.exit(1) model = markovify.combine(models) for i in range(args.count): if args.words > 0: word_tries = args.tries else: word_tries = 1 mantra = None for k in range(word_tries): mantra = model.make_short_sentence(min_chars=args.min, max_chars=args.max, tries=args.tries, test_output=args.no_output_test) if args.words == 0: break if len(mantra.split()) == args.words: break mantra = None if mantra is None: print('Error: could not generate mantra with given constraints') sys.exit(1) if args.format == 'IAST': mantra = transliterate(mantra, DEVANAGARI, IAST) print(mantra)
def compute_calendar(panchangam): festival_rules_main = read_old_festival_rules_dict( os.path.join(CODE_ROOT, 'panchangam/data/festival_rules.json')) festival_rules_rel = read_old_festival_rules_dict( os.path.join(CODE_ROOT, 'panchangam/data/relative_festival_rules.json')) festival_rules_desc_only = read_old_festival_rules_dict( os.path.join(CODE_ROOT, 'panchangam/data/festival_rules_desc_only.json')) festival_rules = { **festival_rules_main, **festival_rules_rel, **festival_rules_desc_only } ics_calendar = Calendar() uid_list = [] alarm = Alarm() alarm.add('action', 'DISPLAY') alarm.add('trigger', timedelta(hours=-4)) # default alarm, with a 4 hour reminder for d in range(1, jyotisha.panchangam.temporal.MAX_SZ - 1): [y, m, dt, t] = swe.revjul(panchangam.jd_start + d - 1) if len(panchangam.festivals[d]) > 0: # Eliminate repeat festivals on the same day, and keep the list arbitrarily sorted panchangam.festivals[d] = sorted(list(set( panchangam.festivals[d]))) summary_text = panchangam.festivals[d] # this will work whether we have one or more events on the same day for stext in sorted(summary_text): desc = '' page_id = '' event = Event() if stext == 'kRttikA-maNDala-pArAyaNam': event.add( 'summary', jyotisha.custom_transliteration.tr( stext.replace('-', ' '), panchangam.script)) fest_num_loc = stext.find('~\#') if fest_num_loc != -1: stext = stext[:fest_num_loc] event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(48)).date()) if stext in festival_rules: desc = json.dumps(festival_rules[stext].get('description_short'), sort_keys=True, indent = 2) + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[stext].get('shlokas'), panchangam.script, False) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % stext) uid = '%s-%d' % (page_id, y) event.add_component(alarm) event.add('description', desc.strip()) uid_list.append(uid) event.add('uid', uid) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) elif stext.find('RIGHTarrow') != -1: # It's a grahanam/yogam, with a start and end time if stext.find('{}') != -1: # Starting or ending time is empty, e.g. harivasara, so no ICS entry continue [stext, t1, arrow, t2] = stext.split('\\') stext = stext.strip('-') event.add( 'summary', jyotisha.custom_transliteration.tr( stext, panchangam.script)) # we know that t1 is something like 'textsf{hh:mm(+1)}{' # so we know the exact positions of min and hour if t1[12] == '(': # (+1), next day event.add( 'dtstart', datetime(y, m, dt, int(t1[7:9]), int(t1[10:12]), tzinfo=tz(panchangam.city.timezone)) + timedelta(1)) else: event.add( 'dtstart', datetime(y, m, dt, int(t1[7:9]), int(t1[10:12]), tzinfo=tz(panchangam.city.timezone))) if t2[12] == '(': # (+1), next day event.add( 'dtend', datetime(y, m, dt, int(t2[7:9]), int(t2[10:12]), tzinfo=tz(panchangam.city.timezone)) + timedelta(1)) else: event.add( 'dtend', datetime(y, m, dt, int(t2[7:9]), int(t2[10:12]), tzinfo=tz(panchangam.city.timezone))) if stext in festival_rules: desc = json.dumps(festival_rules[stext].get('description_short'), sort_keys=True, indent = 2) + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[stext].get('shlokas'), panchangam.script, False) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % stext) event.add('description', desc.strip()) uid = '%s-%d-%02d' % (page_id, y, m) if uid not in uid_list: uid_list.append(uid) else: uid = '%s-%d-%02d-%02d' % (page_id, y, m, dt) uid_list.append(uid) event.add('uid', uid) event.add_component(alarm) ics_calendar.add_component(event) elif stext.find('samApanam') != -1: # It's an ending event event.add( 'summary', jyotisha.custom_transliteration.tr( stext, panchangam.script)) event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) if stext in festival_rules: desc = json.dumps(festival_rules[stext].get('description_short'), sort_keys=True, indent = 2) + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[stext].get('shlokas'), panchangam.script, False) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % stext) # print(event) event.add_component(alarm) event.add('description', desc.strip()) uid = '%s-%d-%02d' % (page_id, y, m) if uid not in uid_list: uid_list.append(uid) else: uid = '%s-%d-%02d-%02d' % (page_id, y, m, dt) uid_list.append(uid) event.add('uid', uid) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) # Find start and add entire event as well desc = '' page_id = page_id.replace('-samapanam', '') event = Event() check_d = d stext_start = stext.replace('samApanam', 'ArambhaH') # print(stext_start) while check_d > 1: check_d -= 1 if stext_start in panchangam.festivals[check_d]: # print(panchangam.festivals[check_d]) start_d = check_d break event.add( 'summary', jyotisha.custom_transliteration.tr( stext.replace('samApanam', '').replace( 'rAtri-', 'rAtriH').replace( 'nakSatra-', 'nakSatram').replace( 'pakSa-', 'pakSaH').replace('kara-', 'karam').replace( 'tsava-', 'tsavaH'), panchangam.script)) event.add('dtstart', (datetime(y, m, dt) - timedelta(d - start_d)).date()) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) # print(event) event.add_component(alarm) event.add('description', desc.strip()) uid = '%s-%d-%02d' % (page_id, y, m) if uid not in uid_list: uid_list.append(uid) else: suff = 0 while uid in uid_list: uid = '%s-%d-%02d-%02d-%d' % (page_id, y, m, dt, suff) suff += 1 uid_list.append(uid) event.add('uid', uid) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) else: summary = jyotisha.custom_transliteration.tr( stext.replace('~', ' ').replace('\#', '#').replace('\\To{}', '▶'), panchangam.script) summary = re.sub('.tamil{(.*)}', '\\1', summary) summary = re.sub('{(.*)}', '\\1', summary) # strip braces around numbers event.add('summary', summary) fest_num_loc = stext.find('~\#') if fest_num_loc != -1: stext = stext[:fest_num_loc] event.add('dtstart', date(y, m, dt)) event.add('dtend', (datetime(y, m, dt) + timedelta(1)).date()) if stext.find('EkAdazI') == -1 and stext.find( 'saGkrAntiH') == -1: if stext in festival_rules: desc = json.dumps(festival_rules[stext].get('description_short'), sort_keys=True, indent = 2) + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[stext].get('shlokas'), panchangam.script, False) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % stext) uid = '%s-%d-%02d' % (page_id, y, m) elif stext.find('saGkrAntiH') != -1: # Handle Sankranti descriptions differently planet_trans = stext.split('~')[ 0] # get rid of ~(rAshi name) etc. if planet_trans in festival_rules: desc = festival_rules[planet_trans].get('description_short') + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[planet_trans].get('shlokas'), panchangam.script) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % planet_trans) uid = '%s-%d-%02d' % (page_id, y, m) else: # Handle ekadashi descriptions differently ekad = '-'.join(stext.split('-') [1:]) # get rid of sarva etc. prefix! if ekad in festival_rules: desc = festival_rules[ekad].get('description_short') + '\n\n' + \ jyotisha.custom_transliteration.tr(festival_rules[ekad].get('shlokas'), panchangam.script) + '\n\n' else: sys.stderr.write( 'No description found for festival %s!\n' % ekad) pref = jyotisha.custom_transliteration.romanise( sanscript.transliterate( stext.split('-')[0], sanscript.HK, sanscript.IAST)) + "-" uid = '%s-%d-%02d' % (pref + page_id, y, m) # print(page_id) event.add_component(alarm) event.add('description', desc.strip()) if uid not in uid_list: uid_list.append(uid) else: suff = 0 while uid in uid_list: uid = '%s-%d-%02d-%02d-%d' % (page_id, y, m, dt, suff) suff += 1 uid_list.append(uid) event.add('uid', uid) event['X-MICROSOFT-CDO-ALLDAYEVENT'] = 'TRUE' event['TRANSP'] = 'TRANSPARENT' event['X-MICROSOFT-CDO-BUSYSTATUS'] = 'FREE' ics_calendar.add_component(event) if m == 12 and dt == 31: break return ics_calendar
"aashvina" : "आश्विनः", "yaamyava" : "याम्यः", "aahneya" : "आह्नेयः", "vaidhaatra" : "वैधात्रः", "chaandra" : "चान्द्रः", "aaditeya" : "आदितेयः", "jaiva" : "जैवः", "vaishnava" : "वैष्णवः", "saura" : "सौरः", "succeeding_braahma" : "ब्राह्मः", "naabhasvata" : "नाभस्वतः", } devanaagarii_to_python = {python_to_devanaagarii[x]: x for x in python_to_devanaagarii } sa_to_tamil = dict(**NAMES["SA_TO_TAMIL"], **{xsanscript.transliterate(x, xsanscript.DEVANAGARI, xsanscript.HK):NAMES["SA_TO_TAMIL"][x] for x in NAMES["SA_TO_TAMIL"]}) def translate_or_transliterate(text, script, source_script=xsanscript.HK): if script == "tamil": if text in sa_to_tamil: return sa_to_tamil[text] else: return jyotisha.custom_transliteration.tr(text, script, source_script=source_script) else: return jyotisha.custom_transliteration.tr(text, script, source_script=source_script) def get_tipu_month_str(month): """ Reference: https://toshkhana.wordpress.com/2014/09/19/dawn-of-a-new-era-tipu-sultan-and-his-mauludi-calendar/