사용자:토끼군/달력스크립트
< 사용자:토끼군
목요일로 시작하는 윤년 등등의 페이지를 만드는 데 사용한 파이썬 스크립트입니다. py 파일을 저장한 후 배치 파일(윈도우즈 이외의 환경에서도 비슷한 방법으로 하면 됩니다)을 실행하면 14개의 텍스트 파일이 생성됩니다.
이 프로그램은 GPL 라이센스로 공개됩니다. 토끼군 2004년 12월 12일 (日) 15:02 (UTC)
calendar.py[편집]
# -*- encoding: mbcs -*- # 위키백과사전 "XX요일로 시작하는 윤/평년 페이지"를 위한 파이썬 스크립트 # 2004년 12월 12일, 토끼군 강 성훈 # # 사용법: python calendar.py <weekday> <isleap> > result.txt # 0(일) <= weekday <= 6(토), isleap in (0, 1) (윤년 여부) wday = ['일', '월', '화', '수', '목', '금', '토'] wday2 = ['Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur'] lday = ['평년', '윤년'] lday2 = ['Common', 'Leap'] dm = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], # non-leap year [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], # leap year ] # 그 해에 대한 정보 반환. (1월 1일의 요일, 윤년여부) def yeartype(y): return ( (datetime.date(y, 1, 1).weekday() + 1) % 7, y%400==0 or y%100!=0 and y%4==0 ) # 해당하는 해(w, l)의 달(m)에 대한 템플릿 출력 def calmonth(w, l, m): print '{|' print '|-' print '| colspan="7" style="text-align:center; background-color:#efefef;"| [[%d월]]' % m print '|- style="text-align:center;"' for ws in wday: print '| style="width:14%;"|', if ws == '일': print '<span style="color:red;">[[%s요일|%s]]</span>' % (ws, ws) else: print '[[%s요일|%s]]' % (ws, ws) print '|- style="text-align:center;"' q = reduce(lambda x,y:x+y, dm[l][:m-1], w) % 7 if q: print '| colspan="%d"| ' % q ld = dm[l][m-1] for d in xrange(1, ld+1): if q == 0: print '| <span style="color:red;">[[%d월 %d일|%d]]</span>' % (m, d, d) else: print '| [[%d월 %d일|%d]]' % (m, d, d) q = (q + 1) % 7 if q == 0: print '|- style="text-align:center;"' elif ld == d: print '| colspan="%d"| ' % (7-q) print '|}' import sys, datetime w, l = int(sys.argv[1]), int(sys.argv[2]) # 해당하는 연도 찾기 yy = [] for y in xrange(1801, 2101): if yeartype(y) == (w, l): yy.append(y) # 가장 가까운 연도를 찾음 ny = 0 cy = datetime.date.today().year for y in yy: if abs(y - cy) < abs(ny - cy): ny = y # 달력 테이블 출력 print "다음은 '''%s요일로 시작하는 %s'''의 달력이다. (예: [[%d년]])" % (wday[w], lday[l], ny) print '{| border="0" cellpadding="6" cellspacing="0"' for m in (1, 5, 9): print '|-' for mm in (0, 1, 2, 3): print '| valign="top"|' calmonth(w, l, m+mm) print '|}' # 이전/다음 해 출력 print '----' print print '{|' if l: print '|- style="background-color:#dddddd;"' print "|'''이전 해:''' [[%s요일로 시작하는 %s]]" % (wday[(w-1)%7], lday[0]) print '|- style="background-color:#dddddd;"' print "|'''다음 해:''' [[%s요일로 시작하는 %s]]" % (wday[(w+2)%7], lday[0]) else: print '|- style="background-color:#dddddd;"' print "|'''이전 해:''' [[%s요일로 시작하는 %s]] 또는 [[%s요일로 시작하는 %s]]" % (wday[(w-1)%7], lday[0], wday[(w-2)%7], lday[1]) print '|- style="background-color:#dddddd;"' print "|'''다음 해:''' [[%s요일로 시작하는 %s]] 또는 [[%s요일로 시작하는 %s]]" % (wday[(w+1)%7], lday[0], wday[(w+1)%7], lday[1]) # 그 밖의 다른 것들 모조리 출력 print '|- style="background-color:#efefef;"' print '| ' + ', '.join(['[[%s요일로 시작하는 %s|%s요일]]' % (ws, lday[0], ws) for ws in wday]) + '로 시작하는 %s' % lday[0] print '|- style="background-color:#efefef;"' print '| ' + ', '.join([ '[[%s요일로 시작하는 %s|%s요일]]' % (ws, lday[1], ws) for ws in wday ]) + '로 시작하는 %s' % lday[1] print '|}' # 해당하는 해들 print '{|' print '|-' print """| style="text-align:center; background-color:#cccccc;"| '''세기'''""", print """|| style="text-align:center; background-color:#cccccc;"| '''해'''""" for c in (19, 20, 21): print '|-' print '| style="background-color:#cccccc;" | [[%d세기]] ||' % c, print ' '.join(['[[%d년]]'%y for y in yy if c*100-100 < y <= c*100]) print '|}' print print '[[en:%s year starting on %sday]]' % (lday2[l], wday2[w])
calendar.bat[편집]
@echo off python calendar.py 0 0 > common_sun.txt python calendar.py 1 0 > common_mon.txt python calendar.py 2 0 > common_tue.txt python calendar.py 3 0 > common_wed.txt python calendar.py 4 0 > common_thu.txt python calendar.py 5 0 > common_fri.txt python calendar.py 6 0 > common_sat.txt python calendar.py 0 1 > leap_sun.txt python calendar.py 1 1 > leap_mon.txt python calendar.py 2 1 > leap_tue.txt python calendar.py 3 1 > leap_wed.txt python calendar.py 4 1 > leap_thu.txt python calendar.py 5 1 > leap_fri.txt python calendar.py 6 1 > leap_sat.txt echo on