HTML Calendar Generator
There is probably a ton of these already, but here is my contribution, based on my personal preferences. I prefer to have week numbers on my calendars, and that the week starts on Mondays. The output is in a 4x3 month format, suitable for printing on a A4 sized landscape oriented paper.
Here is the Python script:
#!/usr/bin/python import calendar import datetime import sys if len(sys.argv) > 1: try: year = int(sys.argv[1]) except ValueError: sys.exit(1) else: year = datetime.date.today().year print '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>%s</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> <style type="text/css"> table.year { background-color: white; } table.month { background-color: gray; border: 5px solid white } td.year-name { background-color: white; text-align: center; font-weight: bold; } td.month-name { background-color: white; text-align: center; font-weight: bold; height: 20px; } td.wday { background-color: lightgray; color: black; text-align: center; width: 30px; height: 20px; } td.day { background-color: white; color: black; text-align: center; width: 30px; height: 20px; } td.week { background-color: lightgray; color: black; text-align: center; font-weight: bold; width: 25px; height: 20px; } h1 { text-align: center; } </style> </head> <body> <table class="year"> <tr><td class="year-name" colspan="4"><h1>%s</h1></td></tr> <tr> <td>''' % (year, year) for month in range(1, 13): skip_days, last_day = calendar.monthrange(year, month) day = 1 print '<table class="month">' print '<tr><td class="month-name" colspan="8">%s</td></tr>''' % (calendar.month_name[month]) print '<tr>' print '<td></td>' for wday in range(0, 7): print '<td class="wday">%s</td>' % (calendar.day_abbr[wday]) print '</tr>' for row in range(6): print '<tr>' try: week = datetime.date(year, month, day).isocalendar()[1] print '<td class="week">%d</td>' % (week) except ValueError: print '<td class="week"></td>' for col in range(7): if skip_days: print '<td class="day"></td>' skip_days -= 1 else: if day > last_day: print '<td class="day"></td>' else: print '<td class="day">%d</td>' % (day) day += 1 print '</tr>' print '</table>' if month % 4 == 0: print '</td>' print '</tr>' if month != 12: print '<tr>' print '<td>' else: print '</td>' print '<td>' print '</table>' print '</body>' print '</html>'
Here is a calendar generated for 2014.