144 lines
4.3 KiB
Python
144 lines
4.3 KiB
Python
"""A deterministic daily selection of public-domain classical Chinese poetry."""
|
|||
|
|
|
||
|
|
from datetime import datetime
|
||
|
|
from zoneinfo import ZoneInfo
|
||
|
|
|
||
|
|
# Original classical works; no modern copyrighted translations are included.
|
||
|
|
POEMS = [
|
||
|
|
(
|
||
|
|
"jing-ye-si",
|
||
|
|
"静夜思",
|
||
|
|
"李白",
|
||
|
|
"床前明月光,疑是地上霜。\n举头望明月,低头思故乡。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"chun-xiao",
|
||
|
|
"春晓",
|
||
|
|
"孟浩然",
|
||
|
|
"春眠不觉晓,处处闻啼鸟。\n夜来风雨声,花落知多少。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"deng-guan-que-lou",
|
||
|
|
"登鹳雀楼",
|
||
|
|
"王之涣",
|
||
|
|
"白日依山尽,黄河入海流。\n欲穷千里目,更上一层楼。",
|
||
|
|
),
|
||
|
|
("xiang-si", "相思", "王维", "红豆生南国,春来发几枝。\n愿君多采撷,此物最相思。"),
|
||
|
|
("lu-zhai", "鹿柴", "王维", "空山不见人,但闻人语响。\n返景入深林,复照青苔上。"),
|
||
|
|
(
|
||
|
|
"zhu-li-guan",
|
||
|
|
"竹里馆",
|
||
|
|
"王维",
|
||
|
|
"独坐幽篁里,弹琴复长啸。\n深林人不知,明月来相照。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"jiang-xue",
|
||
|
|
"江雪",
|
||
|
|
"柳宗元",
|
||
|
|
"千山鸟飞绝,万径人踪灭。\n孤舟蓑笠翁,独钓寒江雪。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"xun-yin-zhe",
|
||
|
|
"寻隐者不遇",
|
||
|
|
"贾岛",
|
||
|
|
"松下问童子,言师采药去。\n只在此山中,云深不知处。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"min-nong",
|
||
|
|
"悯农·其二",
|
||
|
|
"李绅",
|
||
|
|
"锄禾日当午,汗滴禾下土。\n谁知盘中餐,粒粒皆辛苦。",
|
||
|
|
),
|
||
|
|
("feng", "风", "李峤", "解落三秋叶,能开二月花。\n过江千尺浪,入竹万竿斜。"),
|
||
|
|
(
|
||
|
|
"wang-lu-shan",
|
||
|
|
"望庐山瀑布",
|
||
|
|
"李白",
|
||
|
|
"日照香炉生紫烟,遥看瀑布挂前川。\n飞流直下三千尺,疑是银河落九天。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"zao-fa-bai-di",
|
||
|
|
"早发白帝城",
|
||
|
|
"李白",
|
||
|
|
"朝辞白帝彩云间,千里江陵一日还。\n两岸猿声啼不住,轻舟已过万重山。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"wang-tian-men",
|
||
|
|
"望天门山",
|
||
|
|
"李白",
|
||
|
|
"天门中断楚江开,碧水东流至此回。\n两岸青山相对出,孤帆一片日边来。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"zeng-wang-lun",
|
||
|
|
"赠汪伦",
|
||
|
|
"李白",
|
||
|
|
"李白乘舟将欲行,忽闻岸上踏歌声。\n桃花潭水深千尺,不及汪伦送我情。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"shan-xing",
|
||
|
|
"山行",
|
||
|
|
"杜牧",
|
||
|
|
"远上寒山石径斜,白云生处有人家。\n停车坐爱枫林晚,霜叶红于二月花。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"jiang-nan-chun",
|
||
|
|
"江南春",
|
||
|
|
"杜牧",
|
||
|
|
"千里莺啼绿映红,水村山郭酒旗风。\n南朝四百八十寺,多少楼台烟雨中。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"ti-xi-lin-bi",
|
||
|
|
"题西林壁",
|
||
|
|
"苏轼",
|
||
|
|
"横看成岭侧成峰,远近高低各不同。\n不识庐山真面目,只缘身在此山中。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"hui-xiang-ou-shu",
|
||
|
|
"回乡偶书·其一",
|
||
|
|
"贺知章",
|
||
|
|
"少小离家老大回,乡音无改鬓毛衰。\n儿童相见不相识,笑问客从何处来。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"ye-yu-ji-bei",
|
||
|
|
"夜雨寄北",
|
||
|
|
"李商隐",
|
||
|
|
"君问归期未有期,巴山夜雨涨秋池。\n何当共剪西窗烛,却话巴山夜雨时。",
|
||
|
|
),
|
||
|
|
(
|
||
|
|
"feng-qiao",
|
||
|
|
"枫桥夜泊",
|
||
|
|
"张继",
|
||
|
|
"月落乌啼霜满天,江枫渔火对愁眠。\n姑苏城外寒山寺,夜半钟声到客船。",
|
||
|
|
),
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def catalog():
|
||
|
|
return [
|
||
|
|
{
|
||
|
|
"id": p[0],
|
||
|
|
"title": p[1],
|
||
|
|
"author": p[2],
|
||
|
|
"lines": p[3],
|
||
|
|
"source": "Public-domain classical Chinese poetry",
|
||
|
|
"edition": "frame-flow-classics-v1",
|
||
|
|
}
|
||
|
|
for p in POEMS
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def get_poem(date=None, poem_id=None):
|
||
|
|
day = (
|
||
|
|
datetime.strptime(date, "%Y-%m-%d").date()
|
||
|
|
if date
|
||
|
|
else datetime.now(ZoneInfo("Asia/Shanghai")).date()
|
||
|
|
)
|
||
|
|
poems = catalog()
|
||
|
|
if poem_id:
|
||
|
|
selected = next((p for p in poems if p["id"] == poem_id), None)
|
||
|
|
if selected is None:
|
||
|
|
raise ValueError("Unknown poem")
|
||
|
|
else:
|
||
|
|
selected = poems[day.toordinal() % len(poems)]
|
||
|
|
return {**selected, "date": day.isoformat()}
|