From f3d165b0f62cd8b37d59d1a5a90ccc1c74da57b6 Mon Sep 17 00:00:00 2001 From: rogerwang2008 Date: Tue, 10 Nov 2026 21:47:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=96=9C=E9=B9=8A?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E5=B9=B6=E6=9B=B4=E6=96=B0=20PDF=20=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除左上角喜鹊,左下喜鹊右移 3 格,右上喜鹊左移 1 格 - PDF 默认输出改为封面demo.pdf - 重新生成 PDF 样例 --- README.md | 5 +++-- assets/js/scene.js | 5 ++--- scripts/export_pdf.py | 6 +++--- 封面demo.pdf | Bin 0 -> 7151 bytes 4 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 封面demo.pdf diff --git a/README.md b/README.md index 83af9cc..081f929 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ ├─ pyproject.toml # uv 环境与导出依赖 ├─ uv.lock # 依赖锁定 ├─ scripts/export_pdf.py # PDF 导出脚本 +├─ 封面demo.pdf # 导出的 PDF 样例 ├─ assets/ │ ├─ css/style.css # 布局、字号与各元素配色 │ ├─ js/scene.js # 场景数据与网格渲染 @@ -40,8 +41,8 @@ python -m http.server 8000 ```bash uv sync -uv run python scripts/export_pdf.py # 默认 1em = 24px,输出 dist/luori.pdf -uv run python scripts/export_pdf.py --em 16 -o dist/luori-16.pdf +uv run python scripts/export_pdf.py # 默认 1em = 24px,输出 封面demo.pdf +uv run python scripts/export_pdf.py --em 16 -o 封面demo-16.pdf ``` 脚本优先调用本机 Edge / Chrome;若都未安装,可先下载 Playwright Chromium: diff --git a/assets/js/scene.js b/assets/js/scene.js index 386959a..aef877b 100644 --- a/assets/js/scene.js +++ b/assets/js/scene.js @@ -39,11 +39,10 @@ /* 飞鸟:数量减少,间距不等,仅少量成对;上下拉开分布 */ const birds = [ - { x: 0, y: 2, kind: 'magpie' }, - { x: 26, y: 2, kind: 'magpie' }, + { x: 25, y: 2, kind: 'magpie' }, { x: 1, y: 4, kind: 'sparrow' }, { x: 3, y: 8, kind: 'crow' }, - { x: 6, y: 13, kind: 'magpie' }, + { x: 9, y: 13, kind: 'magpie' }, { x: 9, y: 15, kind: 'sparrow' }, { x: 26, y: 5, kind: 'crow' }, { x: 17, y: 9, kind: 'sparrow' }, diff --git a/scripts/export_pdf.py b/scripts/export_pdf.py index e23d2db..4e69fbb 100644 --- a/scripts/export_pdf.py +++ b/scripts/export_pdf.py @@ -5,7 +5,7 @@ 用法: uv run python scripts/export_pdf.py - uv run python scripts/export_pdf.py --em 16 -o dist/luori-16.pdf + uv run python scripts/export_pdf.py --em 16 -o 封面demo-16.pdf """ from __future__ import annotations @@ -138,8 +138,8 @@ def main() -> None: "-o", "--out", type=pathlib.Path, - default=ROOT / "dist" / "luori.pdf", - help="输出文件路径,默认 dist/luori.pdf", + default=ROOT / "封面demo.pdf", + help="输出文件路径,默认 封面demo.pdf", ) args = parser.parse_args() if args.em <= 0: diff --git a/封面demo.pdf b/封面demo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1030ce1e575f785f535149326c200035ff0c500c GIT binary patch literal 7151 zcmaiZ2UwF!)3zN6A|N0NB0)jvNeCfyq!Z~~x-kTZBm_w43LX_uqzFh+ktRKK=~Y1B zC<4-@s|eCnTIhUFP+!k^{r>NtD;K+&y=Ql4uASwc4Zpssx+qLc0>s}vJN*#^14F^Y zYu7;Xb9jEm;l%UBYWG$5uH`hWGq-fRYn{tE(wFdpfI=u5-KhXg@dBx8^8wne~z}E70o6X8hsI^QfTS#Ye*2nbx z%Kp--^Cp9rWpDat9pIX~&*&O>=MHOGWVEymomBiT6Dfq=ez<&>S?SPrn1=uL^v<%x zw){ZMn^alF8yl-H>Qnhaq2acPojq$ieK))(r{?RLZTiJ;3-BMP@hAF8F%-tS^Nfz! z@3d(xwVI!fI^@cGAF;c_wSlyGG2O53^lkC+*OuIeY#&V-!U|X(RmA9pR&|95DDQI8t5eQn0#oqYz-N(kcT=rqwjUP_BX7$DCXL)_g@k&`b zoG6EOIs{*KRfB%?&>Y$H9Uf~KLB2Lc&Gw8|v5sdcn3Wz&EBbnxNxi>Um|HI1Ysa|fmHE(ZQwxbrym&$AOZV;PtiA;Am162ec*EwYg$rwEcJ>L|mvEknTS}of~EV-;q zI{Hy=;z=t$e3Z=PEZ*70P8}_1D@P66rm8j3m?1+07tL9CW zDg1&SC3>DtrzQ5oZQ|F_hPjE~-Dc)8y>mOGA3d^pGII1ZqMbQi`#W#)Ns)}oN-X-; z@`=?e{ME=4aKMtnD7gw-%)FV9Km zan+I!(94eAb)!7gI7N)98aLI=VgK93Nri8TiC%@6S1$Ex!oDX>Sy0g3yu12DY3HTn z#=Cl%bPlV;uyF>?R-N3wC)vW{*9s|CTBEApLmxWxLfm zaV`GZwI>JM&0en>A2`wM8ePmxF;K`qVS7X8uS$xYuh4$_@yyG76 zc^rk;_CUAwAm}Wttgj6@aaP}B>pW_NI&zvZCQ3QQk5ENb=T@?5yzg?}?2=F9+S6j; zdky6cgE}G)rULlxIkKeJ>M2_2(%QRU8nmzME`er`r8W$ z-+guHbD7hv;*zrJ-2&4$)XmuYs?ue22p7QPzSV_K?4Q}l1fr@G41+c+BPLSGkNoS0 z%W|`)Mv}-UIAZH8j}g_)II>)IOiJ!JtH_O8D_k z=A30usqn?-DbDJMxDDsekqSz}eYNCIF@x5sbb{zo6N1Nd!0VBvEYnh@xI5Si=*=PU zc+PlxuyUs_+(;-OOvEhbX<+gY{SCnu|X<-XIrx;6wBt&)uek=?BOkDGnZU zzWA;_FKN!Gywik0usVRO4d5?PDY+CU$a+>POoYLOHTw#^bGEzr%Qm<0{g6}-m&f-e zMaXGHf06n#ESEhGoT;yr&5GnhoyaNWcKt}-S5}aEMp`ZIF?#>l)hi8L5FC1|3VNcbJv@w~-SlzX`$uJvsm*wrE?`M%X{t>Bb7HFin z;4o8e0H(})C&G3A(Bdq;49l?k8Y64{#K$iw+5?_umCwIPm)&=L&1AB2%D5?k^F6n} z{mMk;QzPFc#WU8PJY0Hp(BR_s_LYX6OPI2OJMClHXX4tpXBTTqPCk`A+EC8&uF5ne`*G5+(PQ%JJd79H_|9?xgB>+(D%Qyrze4>7l1OJ9$+8_s2fu z76*?o*@uSZ)wVP*&(&>4xW_pM#BEa$TSwF|;JUv$%Zta8aMf02-y~MC9BJQE|0&S6E(3OY_=7{lP#jGqT{f zPpMG@6;tO@TX(sGfWOqf%c*y!O`%=Ut6Zn1uWlXDsO$LXD&)HA&9?w+JV)2Y5tgo2gCqTmvVk~iWe-$zce0cfZbkOxGUf8-5UuvLywWwd; zH9)3P-(PO^L~?~VXo`!77tvZ zd3P{YxQ=?*ae=81r_2W3T|$JdjrKL8;H7~M;5t&9n0aFb)m_{HCK@bfIFpVV|0;Cb5PIM;IM%58u#19=! ztAn+}p_PeVU`r^VL`XovQsPp;gem|U>r5trY3vc0$ryc&1cn#^JQ(c;=)uUJ)Bf~` z_VpL1|Bpu`+BEI}7$C4(I6D&9lIFOf^=}F*_1|VHXfhg4bf7Kc0K{Q$6%fP}hxNp| z>APX=vB2U#1N0+ue++>jsyLDh9__74#QZ2P$Zqaf1wek0Yw6#M{-C}vFhJEMB_)6u z{a^f80wMV?ejIOmkK2s9rS406jm{vRE3i!>Cfy^*m6H6_J_`M$7&z&=M8SJ74!t%#y`kp;=O$|@HTTA8=hnC4$~4?ZK~Gz#y2H?rrVJIjD;FX z9cglOl#s)hPKaDxS}*W*_?q~5Z2cMVK^3X$cFEkdjkrKnD0Sa#O|&6ZeNK3|{Hh)U zCr}ri6k~@ekvlgWCslp1Y7wbwC?_WF?e?hfokgCphbg44%CR#E&jiat<<}Wr-&F3Z z31aGK q)KOgCIdE@;@3@KxBhdC5gx1BX?HmDKK6EE%GnlFi(trM$p*)4o*G`~%q zK8&i1m00b0TR5<`E{fC)g-2Fp-Q0RL{HDYB@&=_w>~(HVChx`hu~gC^-}B@$)_|aB z_|6NC@zkk?H@aCR=!uXXIbz4L7yeQH%_v3ltfXsdc`%Be#C+Y88q6x=*`fAT>Da&Z7!e7Dw8tqa~U(3?kkaHEt4Ys z?A_VT%TYo_E4|Dl<=@`$HmWCNiBGGGZ>b}c1J@f6*fsR#ZtLa;q?f2pYt_oZ;pI{m<|@4 zEcW;|jj+f!NX&wY@vAMgT!RfsS)feuZ=>)}xgFFL671BBQ&A?B0Sm??PpZ|ljDl2^ zvS)TqiZ@UGL|*pHJK@HJ2DdY>|gWH*mw&-**-yUdgK zex)M)EMbEk&uprSicS2635iwNg^p%r$yK^>tuwhjVk_`7hQq_wF|GbtQQU2o#cdBJ zM>>2=@18#U);BW1JG|TLg;rO&W>hFHqVm3wwtL3zRZ`&%8O~W<#K|h7XdN%}(8EGUt87Me_yHV|Ej)l7y!vxRzN2F_Kju zJx_tncaJ|`oX)nTY*`(j7@w3mOR0Srpzo~!%d7Q~cNVS>D3WClU0({^+B`Z_R4lyZ zKwLT5kEqu@ID|VZsA`%Fp6cb=xyN^6IOq5&ePo# zzt6-ZfSoP)i;kUpkv z^{+W=i|2>|hYdg97hZfXqc;POd`~ftU^0moJ&^b*&}l=#ixmvEwco|oM!TOCsqolOY`U1> zOsLiws%6t*m3_GlqQuhR#m-{I+&(rU3GHF+FB%l+y0#)GZu}RrPgutIgTu14d@5w6D#W^^)`Po=^XcHbG!?oW*=vKgn`%!& zEHW!>BKOIcJG3rJDmPN9%+dk2}ISHVP8?>ekoQ*){?~^K&xZQ`3>QIb)`h zCn*!%6bG1(Q}}?Xr$$}N8s0(eifwIpV8mS*`)ZDG(JO4>*m^_h)r-`A57yA81!+oI z1a!TWx;9D(+U`Z54?2sOZXY)9g%|W#773o3@#Wp+Sdpg`mU%pJN&IN05phwJOJ%r& zdOUHW*l}P)-Sl%QvXZ`TyMNufz%aZSk7g2=KRPDP)yA}{F~)ghHWlRC(Dg26;L5UE zu~0{;3ghA#OCQl(_k+MWfOzp>oRP$pLw94)Lk^QSz81Bvb3G8kH`hvRVJR*zK33%u zzBYPFq8T534A58X`#cod^k$*JY>ex;4B=?$g?^`am=D4VHW^p4x1MuiGWm z#C!L=YGxF|?*VO-!X2PdsSUihmRBAEbbm;HU1-bqV7dGEb~F4{Uok!C6jS{z)#rxp z^_N3<&;5{E4#^glAM%}BF5uS`KU*)x^&>xUpH{F=pR5<@c)Z4#fn5P|taH#s`YS=i zrhRk&z7Jh%P-@@D!n$tQ-e9$&3(xVr-oAbP2e!Bm|L9kD*aJ_3VY4Lgspyv@Qrvk9G5A{30Ci@4P)-_}G%je$r;Z0Kbfq##@Tsc%n3*SE_ zmSMN=*gqBjOaI&0$6f5d^!m3yj z#tr8JJTw1b#=2+%z{8dHMA*Uw=LM+oXa^D)V1-H~42|+i!Qoc{NByS1n|0t!5FLjf-SYe|5S({>H;Q>-|cMqp`_{wMc_{qsS6k9^ahKMa1m2~0>c z1D=S{B=Mj8#yov|$>(2D}2k851>7syb*Fpxm$noW_y8_tZw-B*0^o zvptbkRTyF&a6pmc4Hi%WUa+yibGM$G9o7x!>;M+{Wd#o-9R4DVlcQUik*{qvD#WIv%0b<(DFC$FnptFJId%rM4b_O)bzpxZq;5b>>^? zXyaX%hSpD~JFeQKZ)dF~=8ZR>7%FQVFC8zTeu)-5{BY}KtJ_fH!O zd0TP2*HANk;}qm?<0t7^M<(J)Pm&XNWjhjZ8B5Df$F$QbG7*{aMRAwaFbIK8damBb znQzX_9CtSe)98&iF0DAi@BKI`0I;)D! zL}{kzTsAJ{klN+fI*(wkAsyZ|=~U0biqt-w*aS>%Gen^sx3jEk)B0?IH)(7f6U>li zB6imHE5Q=^Cgm%Wlv$a?pNUDULjTB1+7bDA5NRh6NRj`?c~x@;e!ZX_um7A%QO#e8 zX@>?<1vtY%#krRphQN6;CYm_oXg_#>VS82R@BHxs>PirhaBvWiaz6zui9o;+V0-X? zbTDAMGyyyR(uo7v`QJJy910Z7|HeV#5`W-;D+9>l|HeuEfrCT;w1q>Zfx7wMws7%3 z_lH0t{=gxm|6D^-oED^C^O4=qz$N2G`*qF;=L19w4m?Z{iNN*uSOZev(o!1c;wsO-~*4KXIB_ZvX%Q literal 0 HcmV?d00001