"""대한민국 공휴일 판정 + 이름 (달력 색상·표기용). - 고정 양력 공휴일은 매년 동일 → 연도 무관 판정. - 음력 공휴일(설날/부처님오신날/추석)과 대체공휴일은 매년 달라짐 → 연도별 dict(`_LUNAR_AND_SUBSTITUTE`)에 명시. 새 연도는 KASI 발표값을 추가한다. - 대체공휴일은 원래 공휴일 이름 대신 "대체공휴일"로 표기한다. 미수록 연도는 고정 양력 공휴일만 빨강 처리된다(음력/대체는 누락). """ from __future__ import annotations from datetime import date SUBSTITUTE = "대체공휴일" # 매년 동일한 양력 공휴일 (month, day) -> 이름 _FIXED_SOLAR: dict[tuple[int, int], str] = { (1, 1): "신정", (3, 1): "삼일절", (5, 5): "어린이날", (6, 6): "현충일", (7, 17): "제헌절", # 2026년부터 공휴일. 대체공휴일 대상 아님(토·일과 겹쳐도 대체 없음) (8, 15): "광복절", (10, 3): "개천절", (10, 9): "한글날", (12, 25): "성탄절", } # 연도별 음력 공휴일 + 대체공휴일 (ISO 날짜 -> 이름). KASI 발표 기준. _LUNAR_AND_SUBSTITUTE: dict[int, dict[str, str]] = { 2025: { "2025-01-28": "설날 연휴", "2025-01-29": "설날", "2025-01-30": "설날 연휴", "2025-03-03": SUBSTITUTE, # 삼일절(3/1 토) "2025-05-05": "부처님오신날", # 어린이날과 같은 날 "2025-05-06": SUBSTITUTE, # 부처님오신날 겹침 "2025-10-06": "추석", "2025-10-07": "추석 연휴", "2025-10-08": SUBSTITUTE, # 추석 연휴 겹침 }, 2026: { "2026-02-16": "설날 연휴", "2026-02-17": "설날", "2026-02-18": "설날 연휴", "2026-03-02": SUBSTITUTE, # 삼일절(3/1 일) "2026-05-24": "부처님오신날", "2026-05-25": SUBSTITUTE, "2026-08-17": SUBSTITUTE, # 광복절(8/15 토) "2026-09-24": "추석 연휴", "2026-09-25": "추석", "2026-09-26": "추석 연휴", "2026-09-28": SUBSTITUTE, "2026-10-05": SUBSTITUTE, # 개천절(10/3 토) }, 2027: { "2027-02-06": "설날 연휴", "2027-02-07": "설날", "2027-02-08": "설날 연휴", "2027-02-09": SUBSTITUTE, "2027-05-13": "부처님오신날", "2027-08-16": SUBSTITUTE, # 광복절(8/15 일) "2027-09-14": "추석 연휴", "2027-09-15": "추석", "2027-09-16": "추석 연휴", "2027-10-04": SUBSTITUTE, # 개천절(10/3 일) "2027-10-11": SUBSTITUTE, # 한글날(10/9 토) }, } def holiday_name(d: date) -> str: """그날의 공휴일 이름. 공휴일이 아니면 빈 문자열. 한 날에 두 공휴일이 겹치면 "어린이날·부처님오신날" 처럼 이어 붙인다. """ names: list[str] = [] fixed = _FIXED_SOLAR.get((d.month, d.day)) if fixed: names.append(fixed) extra = _LUNAR_AND_SUBSTITUTE.get(d.year, {}).get(d.isoformat()) if extra and extra not in names: names.append(extra) return "·".join(names) def is_holiday(d: date) -> bool: """공휴일(일요일 제외)이면 True. 일/토 색상은 요일로 따로 판정한다.""" return bool(holiday_name(d))