사용자:토끼군/달력스크립트
위키백과 ― 우리 모두의 백과사전.
< 사용자:토끼군
목요일로 시작하는 윤년 등등의 페이지를 만드는 데 사용한 파이썬 스크립트입니다. 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 '<font color="red">[[%s요일|%s]]</font>' % (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 '| <font color="red">[[%d월 %d일|%d]]</font>' % (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

