사용자:토끼군/달력스크립트

위키백과, 우리 모두의 백과사전.

목요일로 시작하는 윤년 등등의 페이지를 만드는 데 사용한 파이썬 스크립트입니다. 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