From cc2d8617622773c449860ee2203935e2d1018db0 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sun, 1 Nov 2026 21:26:16 +0800 Subject: [PATCH 1/2] Update build.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 构建时用站点标志生成主屏幕图标和网页应用清单。 --- website/builder/build.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/website/builder/build.py b/website/builder/build.py index d0db921c..72ecdcda 100644 --- a/website/builder/build.py +++ b/website/builder/build.py @@ -213,6 +213,32 @@ def section_tree(dist, sidebar): return tree +def write_app_icons(dist, logo): + """主屏幕图标和网页应用清单:用站点标志生成;有底色的图标给 iOS 和 maskable 用,标志在中间的安全区内。""" + from PIL import Image + with Image.open(logo) as image: + mark = image.convert('RGBA') + mark = mark.crop(mark.getchannel('A').getbbox()) + icons = dist / 'icons' + icons.mkdir(exist_ok=True) + for name, size, scale, background in [('icon-180.png', 180, .84, '#ffffff'), ('icon-192.png', 192, 1, None), + ('icon-512.png', 512, 1, None), ('maskable-512.png', 512, .76, '#ffffff')]: + canvas = Image.new('RGBA', (size, size), background or (0, 0, 0, 0)) + side = round(size * scale) + resized = mark.resize((side, round(side * mark.height / mark.width)), Image.LANCZOS) + canvas.alpha_composite(resized, ((size - resized.width) // 2, (size - resized.height) // 2)) + canvas.save(icons / name, optimize=True) + manifest = { + 'name': 'CS-Notes', 'short_name': 'CS-Notes', 'lang': 'zh-CN', + 'description': '技术面试必备的计算机基础知识,涵盖算法、操作系统、计算机网络、数据库、Java 与系统设计。', + 'start_url': '/', 'scope': '/', 'display': 'standalone', 'background_color': '#f3f2ee', 'theme_color': '#f3f2ee', + 'icons': [{'src': '/icons/icon-192.png', 'sizes': '192x192', 'type': 'image/png'}, + {'src': '/icons/icon-512.png', 'sizes': '512x512', 'type': 'image/png'}, + {'src': '/icons/maskable-512.png', 'sizes': '512x512', 'type': 'image/png', 'purpose': 'maskable'}], + } + (dist / 'manifest.webmanifest').write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + '\n') + + def build(optimize=True): global IMAGE_BY_NAME, ANCHORS IMAGE_BY_NAME = repository_images() @@ -274,6 +300,7 @@ def build(optimize=True): # 允许收录;学习站每道题的页面列在它的站点地图中(笔记页面在 # 之后,没有单独的地址) (dist / 'robots.txt').write_text('User-agent: *\nAllow: /\n' + (f'Sitemap: {SITE_URL}learn/sitemap.xml\n' if LEARN_BUILD.is_file() else '')) shutil.copyfile(ROOT / 'docs/_media/LogoMakr_1J56bI.png', dist / 'favicon.png') + write_app_icons(dist, ROOT / 'docs/_media/LogoMakr_1J56bI.png') learn_report = None if LEARN_BUILD.is_file(): # 学习站的问题(链接到的小节改名、题目和要点对不上)只给警告,不挡住笔记的发布;警告写进构建报告 From 3dd2b41469330538890960213af43016803b4363 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sun, 1 Nov 2026 21:26:16 +0800 Subject: [PATCH 2/2] Update index.html MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入主屏幕图标、网页应用清单和分享时显示的标题、简介。 --- website/templates/index.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/website/templates/index.html b/website/templates/index.html index ec972d49..fad9a334 100644 --- a/website/templates/index.html +++ b/website/templates/index.html @@ -8,6 +8,15 @@ CS-Notes · CyC2018 + + + + + + + + +