Files
pigway-frame-flow/pigway_frame_flow/providers/poetry.py
T

144 lines
4.3 KiB
Python
Raw Normal View History

"""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()}