From 8ae7b2a60eceab9fc0f4afc66eb9e53a6c74be30 Mon Sep 17 00:00:00 2001 From: RiseForever Date: Thu, 13 Aug 2026 00:26:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 88x31.gif | Bin 0 -> 82451 bytes README.md | 24 +-- astro.config.mjs | 20 +- public/assets/meta/7f3c91a2e64b.txt | 2 + public/media/cache/c4e29b718fd5.txt | 2 + public/resources/data/f17a8c46d293.txt | 2 + src/components/Footer.astro | 51 ++++- src/components/Masthead.astro | 6 +- src/components/Navbar.astro | 1 - src/components/NavigationProgress.astro | 1 - src/components/WritingHeatmap.astro | 2 +- src/content/pages/about.md | 188 +++++++++++++++++ src/content/pages/links.md | 11 + src/content/pages/test-page.md | 20 -- src/content/posts/eidolon-basic-guide.md | 254 +++++++++++++++++++++++ src/content/posts/markdown-test.md | 167 --------------- src/layouts/BaseLayout.astro | 36 +++- src/lib/notice-shortcode.ts | 52 +++++ src/lib/responsive-tables.ts | 25 +++ src/lib/shortcodes.ts | 99 +++++++-- src/pages/archives/index.astro | 2 +- src/pages/index.astro | 4 +- src/pages/links/index.astro | 90 ++++++++ src/pages/page/[page].astro | 4 +- src/site.config.ts | 38 ++-- src/styles/content.css | 167 ++++++++++++--- src/styles/shortcodes.css | 147 ++++++++++--- 27 files changed, 1084 insertions(+), 331 deletions(-) create mode 100644 88x31.gif create mode 100644 public/assets/meta/7f3c91a2e64b.txt create mode 100644 public/media/cache/c4e29b718fd5.txt create mode 100644 public/resources/data/f17a8c46d293.txt create mode 100644 src/content/pages/about.md create mode 100644 src/content/pages/links.md delete mode 100644 src/content/pages/test-page.md create mode 100644 src/content/posts/eidolon-basic-guide.md delete mode 100644 src/content/posts/markdown-test.md create mode 100644 src/lib/notice-shortcode.ts create mode 100644 src/lib/responsive-tables.ts create mode 100644 src/pages/links/index.astro diff --git a/88x31.gif b/88x31.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa5ae6408af0a4c5e02b36dcc57159287e4acf73 GIT binary patch literal 82451 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 eJ`@PS;19yUziih3R!09%FZ} { + copyFileSync(rootGif, resolve(fileURLToPath(dir), '88x31.gif')); + } + } +}; let githubData = {}; try { @@ -20,7 +34,7 @@ try { export default defineConfig({ site: siteConfig.site.url, - integrations: [sitemap()], + integrations: [sitemap(), copyRootGif], vite: { plugins: [tailwindcss()] }, @@ -34,7 +48,7 @@ export default defineConfig({ }, processor: unified({ remarkPlugins: [remarkMath, [shortcodes, { githubData, siteUrl: siteConfig.site.url }]], - rehypePlugins: [rehypeKatex, [externalLinks, { siteUrl: siteConfig.site.url }]] + rehypePlugins: [rehypeKatex, noticeShortcode, responsiveTables, [externalLinks, { siteUrl: siteConfig.site.url }]] }) } }); diff --git a/public/assets/meta/7f3c91a2e64b.txt b/public/assets/meta/7f3c91a2e64b.txt new file mode 100644 index 0000000..e5cf546 --- /dev/null +++ b/public/assets/meta/7f3c91a2e64b.txt @@ -0,0 +1,2 @@ +RiseForever +RSV diff --git a/public/media/cache/c4e29b718fd5.txt b/public/media/cache/c4e29b718fd5.txt new file mode 100644 index 0000000..e5cf546 --- /dev/null +++ b/public/media/cache/c4e29b718fd5.txt @@ -0,0 +1,2 @@ +RiseForever +RSV diff --git a/public/resources/data/f17a8c46d293.txt b/public/resources/data/f17a8c46d293.txt new file mode 100644 index 0000000..e5cf546 --- /dev/null +++ b/public/resources/data/f17a8c46d293.txt @@ -0,0 +1,2 @@ +RiseForever +RSV diff --git a/src/components/Footer.astro b/src/components/Footer.astro index bea881f..3b11218 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,17 +1,33 @@ --- import { siteConfig } from '@/site.config'; +import lightSticker from '@/images/Written-By-Human-white.svg'; +import darkSticker from '@/images/Written-By-Human-black.svg'; const containsChinese = (value: string) => /[\u3400-\u9fff]/.test(value); +const blogDomain = new URL(siteConfig.site.url).hostname; +const blogsClubBadge = `https://www.blogsclub.org/badge/${blogDomain}/theme`; ---
+ + + {siteConfig.footer.links.length > 0 && } - {siteConfig.footer.copyright &&

{siteConfig.footer.copyright}

} +

Powered By Astro · Theme Eidolon

+ {siteConfig.footer.copyright &&

{siteConfig.footer.copyright}

} {siteConfig.footer.note && } {siteConfig.footer.theme &&

{siteConfig.footer.theme.label}

} -

Powered By Astro. Theme Eidolon

-
+
+ + diff --git a/src/components/Masthead.astro b/src/components/Masthead.astro index 257f8d4..b778440 100644 --- a/src/components/Masthead.astro +++ b/src/components/Masthead.astro @@ -122,8 +122,8 @@ const position = banner?.position ?? siteConfig.banner.position; .masthead-separator { font-family: Consolas, Menlo, Monaco, 'lucida_console', 'Liberation_Mono', 'Courier_New', 'andale_mono', monospaceX, monospace, sans-serif; } .masthead-date strong { font-family: var(--mirages-font-ui); font-weight: 400; } .masthead-category { font-family: var(--mirages-font-ui); } - .about-avatar { animation: avatar-rotate 8s ease-in-out infinite alternate; } - @keyframes avatar-rotate { from { transform: rotate(-2deg); } to { transform: rotate(2deg); } } + .about-avatar { transform: rotate(0deg); transition: transform 0.5s cubic-bezier(0.33, 1, 0.68, 1); } + .about-avatar:hover { transform: rotate(-32deg); } @media (min-width: 48rem) { section { height: var(--desktop-height); } } - @media (prefers-reduced-motion: reduce) { .about-avatar { animation: none; transform: none; } } + @media (prefers-reduced-motion: reduce) { .about-avatar { transition: none; transform: none; } .about-avatar:hover { transform: none; } } diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro index e643034..905465e 100644 --- a/src/components/Navbar.astro +++ b/src/components/Navbar.astro @@ -168,7 +168,6 @@ const { overlay = false } = Astro.props; .navbar-over-banner { border-color: color-mix(in srgb, var(--color-border) 70%, transparent); background: color-mix(in srgb, var(--color-bg) 82%, transparent); - box-shadow: 0 2px 10px color-mix(in srgb, var(--color-text) 12%, transparent); } .navbar-over-banner [data-navbar-tools] > [data-toolbar-item] > a:hover, diff --git a/src/components/NavigationProgress.astro b/src/components/NavigationProgress.astro index d4a6f17..49c3356 100644 --- a/src/components/NavigationProgress.astro +++ b/src/components/NavigationProgress.astro @@ -114,7 +114,6 @@ min-height: 3px; max-height: 3px; background: var(--color-accent); - box-shadow: 0 3px 8px rgb(0 0 0 / 35%); transform: scaleX(0); transform-origin: left center; transition: transform 240ms linear; diff --git a/src/components/WritingHeatmap.astro b/src/components/WritingHeatmap.astro index 4fc7260..f583520 100644 --- a/src/components/WritingHeatmap.astro +++ b/src/components/WritingHeatmap.astro @@ -187,7 +187,7 @@ const totalWordsLabel = totalWords >= 10_000 const availableCellSize = (heatmapScroll.clientWidth - 3.25 * baseRootFontSize) / 53; if (scale <= 1.01 || baseCellSize === 0) { - baseCellSize = Math.min(12, Math.max(8, availableCellSize)); + baseCellSize = Math.max(8, availableCellSize); } heatmapGrid.style.setProperty('--heatmap-cell-size', `${baseCellSize * scale}px`); heatmapViewport?.classList.toggle('has-overflow', heatmapGrid.getBoundingClientRect().width > heatmapScroll.clientWidth + 1); diff --git a/src/content/pages/about.md b/src/content/pages/about.md new file mode 100644 index 0000000..5c400e7 --- /dev/null +++ b/src/content/pages/about.md @@ -0,0 +1,188 @@ +--- +cover: "https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=1600&q=80" +title: "关于" +pubDate: "2026-07-22T01:28:00.000Z" +updatedDate: "2026-07-27T05:26:00.000Z" +categories: +tags: +slug: "about" +comments: false +--- + +## 关于⌈我⌋ + +我是 RiseForever,生于河南。 + +准高二了。喜欢开发软件、科技数码。是一名 Xiaomi Vela 快应用开发者。 + +性格偏多疑敏感,善于察觉身边人的微小情绪。平时喜欢独处,不喜欢与任何人一起逛街、看电影,因为我感觉受到束缚。 + +如果你想知道我是一个怎样的人,请随便翻翻[我的文章](/archives),里面写的比我说的更清楚。 + +### 联系 + +电子邮箱:hi[at]riseforever.cn(请将“[at]”替换为“@”) + +GitHub:[virelyx258](https://github.com/virelyx258) + +请不要试图添加我的即时通讯账户。无论有什么想探讨的,随时欢迎电邮交流。 + +### 使用的工具 + +[tools title = "设计"] +[Canva](https://www.canva.cn)+(https://image.luming.cool/i/2026/08/07/6a75ba231df9b.webp)/(图像设计) +[即时设计](https://js.design)+(https://image.luming.cool/i/2026/08/07/6a75c0b9bbf29.webp)/(UI 设计) +[Microsoft 365](https://m365.cloud.microsoft/)+(https://image.luming.cool/i/2026/08/07/6a75bd0318e8e.webp)/(文档处理) +[剪映](https://www.capcut.cn/)+(https://image.luming.cool/i/2026/08/07/6a75bf6a337d1.webp)/(视频剪辑) +[/tools] + +[tools title = "生产力"] +[Chrome](https://google.cn/chrome/)+(https://image.luming.cool/i/2026/08/07/6a75c029d170b.webp)/(网页浏览) +[Edge](https://explore.microsoft.com/zh-cn/edge?ep=2185&form=MA14LR&es=375&cs=2324297850)+(https://image.luming.cool/i/2026/08/07/6a75c06af3bd2.webp)/(网页浏览) +[Typora](https://typoraio.cn/)+(https://image.luming.cool/i/2026/08/07/6a75bfad4d232.webp)/(Markdown 编辑) + +[/tools] + +[tools title = "开发"] +[AIoT IDE](https://iot.mi.com/vela/quickapp/)+(https://image.luming.cool/i/2026/08/07/6a75bd500971b.webp)/(快应用编写 & 调试) +[VS Code](https://code.visualstudio.com/)+(https://image.luming.cool/i/2026/08/07/6a75c0ba31e58.webp)/(全能 IDE) +[记事本](#)+(https://image.luming.cool/i/2026/08/07/6a75c16e34a58.webp)/(你懂的,真的便捷) +[/tools] + +[tools title = "环境"] +[Windows 11](https://news.microsoft.com/windows11-general-availability/)+(https://image.luming.cool/i/2026/08/07/6a75c1d50d47d.webp)/(主力系统) +[Debian 13](https://www.debian.org/index.zh-cn.html)+(https://image.luming.cool/i/2026/08/07/6a75c2db6a6e9.webp)/(备用系统) +[/tools] + +## 关于⌈这个网站⌋ + +严格来说,这个网站的建立时间是在 2024 年 10 月。因为我在那时开始转型记录生活。 + +有些话我没法对任何人说,于是就在这里写下。 + +### 域名 + +起初用的是 riseforever.cn,因为初中时我很想要一个有美好寓意的域名,想了很多,结果只有这个域名可注册。于是我选了它,网名也跟着取成了“RiseForever”。 + +初三时,我觉得 riseforever.cn 太长了,且 .CN 当时仍不支持隐私保护,便想着换个域名。当时朋友买了一个“mnb.cool”,让我看到了 .cool 这个后缀。过了几天,我在学校灵机一动——用自己的名字拼写“luming”做前缀,使用“.cool”后缀,这样搭配在视觉上非常和谐。 + +那周周末,我回家一搜 luming.cool ——未注册,于是赶紧注册了它。 + +| 注册商 | 帝思普(腾讯云) | +| -------------: | :------------------------------------------------------------------------------------------------------------- | +| 首次购入价格 | ¥48 | +| 续费价格 | ¥65 | +| 域名年龄 | ![域名年龄徽章](https://yisi.yun/api/badge/domain-age/luming.cool?theme=blue&lang=zh&size=medium&mode=light) | + +[collapse title="riseforever.cn 信息"] + +| 注册商 | 云讯(腾讯云) | +| -------------: | :---------------------------------------------------------------------------------------------------------------- | +| 首次购入价格 | ¥33 | +| 续费价格 | ¥38 | +| 域名年龄 | ![域名年龄徽章](https://yisi.yun/api/badge/domain-age/riseforever.cn?theme=blue&lang=zh&size=medium&mode=light) | + +[/collapse] + +目前保持着 riseforever.cn 和 luming.cool 双域名持有,每年续费大约需要¥103。 + +### 服务器 + +于 2026 年 7 月 21 日搬迁至 007IDC 的香港 BGP 线路服务器,经实测晚高峰也能跑满带宽 100 Mbps,三网回程经过优化,表现优异,河南联通 ping 延迟仅 31ms。 + +首月 9 元,后续叠加优惠,¥17.5/月。 + +| 厂商 | [007IDC](https://www.007idc.cn/aff/ZFIKNXMX) | +| -----: | :--------------------------------------------- | +| CPU | 2H Platinum 8272CL | +| 内存 | 2G DDR4 | +| 硬盘 | 30GB SSD | +| 带宽 | 100 Mbps(峰值) | + +[collapse title="2026 年 1 月 - 6 月"] +7iNet 香港特惠秒杀机,¥9.9/月,炸夸响。后因其性能太过诡异而被更换。 + +| CPU | 2H E5-2698 v4 | +| -----: | :-------------------------------------- | +| 内存 | 2G | +| 硬盘 | 40GB SSD(写入 43MB/s,读取 156MB/s) | +| 带宽 | 10 Mbps(不限流量) | + +[/collapse] + +[collapse title="2026 年以前"] +腾讯云新加坡服务器,¥99/年,买了两年,参加活动又送了三个月。后因 IP 线路更换导致延迟过高而被更换。 + +| CPU | 2H Platinum 8255C | +| -----: | :--------------------------------------- | +| 内存 | 2G | +| 硬盘 | 50GB SSD(写入 338MB/s,读取 6.2GB/s) | +| 带宽 | 30 Mbps(月限流 1TB) | + +[/collapse] + +### CDN + +使用[毅融盾](https://rcdn.hydun.com/)进行图床加速。 + +毅融盾是融合了网宿与白山 CDN 资源的企业级 CDN,针对未备案域名进行特调,提供卓越的中国大陆访问速度。且没有三六九等的套餐配置,仅按流量计费,出售的是流量包。 + +毅融盾是我所在公司的产品,内部团队可免费使用,不限流量。如果你是外部用户,也可以通过[赞助计划](https://blog.hydun.com/9.html)免费获取 CDN 服务。 + +### 主题 + +使用自己制作的 Astro 主题 Eidolon。 + +它极大程度上复刻了 Typecho 主题 Mirages 的风格和功能,又在此基础上使用了更先进的 TailWind CSS,使得站点响应速度更加优秀。 + +~~因为 Mirages 是一款付费主题,如果贸然开源会影响到原主题的销售,且本站主题仍处于开发状态,所以本主题暂不开源。~~ + +仔细想想,发现我们其实不是同一个赛道。我做的是 Astro 主题,受众是 Astro 用户,不耽误 Typecho 主题的销售。况且,并不是所有 Typecho 用户都能无感切换到静态博客。 + +所以,本主题准备开源。 + +[collapse title="在此之前"] + +使用 [Mirages](https://get233.com/archives/mirages-intro.html),一款阅读体验优秀的单栏 Typecho 主题。 + +我是在[白熊阿丸的小屋](https://blog.bxaw.name)首次体验这款主题,发现它支持用户手动切换衬线/非衬线字体、字体大小,这能使不同口味的用户都获得最适合自己的阅读体验。并且,这款主题在我的 MacBook Pro 2013 上表现得非常流畅。 + +于是在 2026 年 4 月,我选择购入并使用它。 + +[/collapse] + +### 使用的第三方服务 + +使用 [WeAvatar](https://weavatar.com/) 作为评论区头像系统。 + +使用 [LUM ALBUM](https://image.luming.cool) 作为图床。(~~这也算第三方服务嘛~~) + +### 备案 + +本站永远都不会考虑备案。 + +## 关于⌈我的作品⌋ + +[tools title = "Xiaomi Vela 快应用"] + +[真智学](https://astrobox.online/open?source=resv2&id=cn.seedsoft.realzhixue&provider=OfficialV2)+(https://image.luming.cool/i/2026/08/07/6a75c6781929d.webp)/(免费 · 智学网客户端) + +[极物流](https://astrobox.online/open?source=resv2&id=cn.seedsoft.express&provider=OfficialV2)+(https://image.luming.cool/i/2026/08/07/6a75c6910d03b.webp)/(订阅制 · 快递查询工具) + +[Poster](https://astrobox.online/open?source=resv2&id=com.virelyx258.poster&provider=OfficialV2)+(https://image.luming.cool/i/2026/08/07/6a75c7021f80e.webp)/(免费 · 网络请求工具) + +[/tools] + +[tools title = "开源项目"] + +[RStatus](https://github.com/virelyx258/RStatus)+(https://image.luming.cool/i/2026/08/08/6a7729950adcd.webp)/(公开你的互联网在线状态) + +[火苗调试器](https://github.com/virelyx258/Flame-Debugger)+(https://image.luming.cool/i/2026/08/08/6a772a0218e74.webp)/(适用于网课软件的调试工具) + +[/tools] + +## 关于⌈版权协议⌋ + +如果没有特殊说明,本站文章都是原创,基于 [CC-BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans) 协议公开。 + +转载请注明原文链接。[协议](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans)原则上不允许对本站文章的再混合、转换、或者二次创作。如果有必要二创,请邮件沟通。 diff --git a/src/content/pages/links.md b/src/content/pages/links.md new file mode 100644 index 0000000..b179e49 --- /dev/null +++ b/src/content/pages/links.md @@ -0,0 +1,11 @@ +--- +title: "友人" +description: "本站收藏的一些精品中文博客" +pubDate: "2026-07-22T01:28:00.000Z" +cover: "https://images.unsplash.com/photo-1490730141103-6cac27aaab94?auto=format&fit=crop&w=1600&q=80" +slug: "links" +--- + +## 单向链接 + +[路明笔记](https://www.luming.cool)+(https://image.luming.cool/i/2026/05/10/6a001b4129893.png)/(一名高中生的技术和生活博客。) \ No newline at end of file diff --git a/src/content/pages/test-page.md b/src/content/pages/test-page.md deleted file mode 100644 index 1279e28..0000000 --- a/src/content/pages/test-page.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "测试页面" -description: "主题初始化后创建的测试页面。" -pubDate: "2026-08-11T00:00:00.000Z" -categories: [] -tags: [] -slug: "test-page" -draft: false -comments: false -toc: true ---- - -## 测试页面 - -这是主题初始化后创建的测试页面。 - -你可以在这里检查独立页面的标题、正文、链接和列表排版: - -- [Markdown 排版测试文章](/posts/markdown-test/) -- [Astro 官方网站](https://astro.build/) diff --git a/src/content/posts/eidolon-basic-guide.md b/src/content/posts/eidolon-basic-guide.md new file mode 100644 index 0000000..ea44f22 --- /dev/null +++ b/src/content/posts/eidolon-basic-guide.md @@ -0,0 +1,254 @@ +--- +title: "Eidolon 主题基本使用教程" +pubDate: "2026-08-13T00:25:27.180Z" +categories: ['主题'] +tags: ['主题'] +draft: false +--- + +欢迎使用 Eidolon,本文将带着您快速入手,使用 Eidolon 轻松定制您的个人博客。 + +--- + +## 站点基础信息 + +欲修改站点基础信息(如站点标题、Banner 大标题、副标题、背景图等),您需要编辑 `/src/site.config.ts`。 + +其中,`site`块代表站点总体配置。示例格式如下: + +```ts +site: { + title: 'Eidolon', + description: '一款轻量、简洁且美观的 Astro 主题', + author: { + name: 'Eidolon', + avatar: 'https://weavatar.com/avatar/302380667bdaf4e1390800e62494d4af?s=512&r=G', + bio: '一款轻量、简洁且美观的 Astro 主题', + rotateAvatar: true + }, + locale: 'zh-CN', + url: 'https://www.luming.cool', + favicon: 'https://image.luming.cool/i/2026/05/10/6a001b4129893.png' + }, +``` + +每个字段的含义如下表: + +| 字段 | 含义 | 类型 | +| :------------------: | :----------------------------------------------: | :----: | +| title | 站点名称,也作为显示在浏览器标签页的标题 | 文本型 | +| description | 站点简介,也用于 SEO 描述 | 文本型 | +| author: name | 博主昵称 | 文本型 | +| author: avatar | 博主头像,填写图片链接 | 文本型 | +| author: bio | 博主的个性签名 | 文本型 | +| author: rotateAvatar | 是否开启关于页面的头像旋转动画 | 布尔型 | +| locale | 站点语言 | 文本型 | +| url | 站点的域名 | 文本型 | +| favicon | 站点图标,同时作为浏览器标签页图标,填写图片链接 | 文本型 | + +## 导航栏设置 + +`navigation`块代表导航项目。示例格式如下: + +```ts +navigation: [ + { label: '首页', href: '/', external: false }, + { label: '归档', href: '/archives/', external: false }, + { label: '友人', href: '/links/', external: false }, + { label: '关于', href: '/about/', external: false } + ], +``` + +每个字段的含义如下表: + +| 字段 | 含义 | 类型 | +| :------: | :----------------------------------------------: | :----: | +| label | 对外显示的导航名称 | 文本型 | +| href | 点击后跳转的链接,支持站内相对地址和站外绝对地址 | 文本型 | +| external | 是否为外部链接,它决定链接是否在新标签页打开 | 布尔型 | + +[hint type="info" title="提示"]无论是顶栏还是侧栏,都有一个“分类”选项,以展示博客里存在的所有分类。该项目无法删除。[/hint] + +## Pjax 无刷新加载 + +`pjax`块代表无刷新加载开关。示例代码: + +```ts + pjax: { + enabled: true + }, +``` + +本主题默认开启 Pjax 以获得更好的浏览体验。如果存在兼容性问题,可将 `enabled` 属性设置为 false 以关闭。 + +## 颜色设置 + +`appearance`块代表着主题的样式设置。包括深浅色模式和强调色。 + +示例代码如下: + +```ts + appearance: { + defaultTheme: 'auto', + accentColor: '#1abc9c' + }, +``` + +每个字段的含义如下表: + +| 字段 | 含义 | 类型 | +| :----------: | :----------------------------------------------------------: | :-----------------: | +| defaultTheme | 用户首次访问博客时,默认采用的主题类型。`auto`代表自动,`light`代表浅色主题,`sunset`代表日落主题,`dark`代表深色主题。 | 文本型 | +| accentColor | 强调色。会影响部分手机浏览器,决定系统状态栏的氛围颜色。 | HEX颜色值(文本型) | + +## Banner 设置 + +`Banner`块代表首页的 Banner 设置。示例代码如下: + +```ts + banner: { + enabled: true, + title: 'Eidolon', + subtitle: '一款轻量、简洁且美观的 Astro 主题', + image: 'https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=2000&q=85', + position: 'center center', + desktopHeightVh: 55, + mobileHeightVh: 40, + overlay: 0.25, + textTone: 'auto' + }, +``` + +各字段含义如下表: + +| 字段 | 含义 | 类型 | +| :-------------: | :----------------------------------------------------------: | :----: | +| enabled | 是否启用 Banner。如果设为 false,则下方所有项目都不起作用。 | 布尔型 | +| title | 大标题 | 文本型 | +| subtitle | 小标题 | 文本型 | +| image | 背景图片,填写图片链接 | 文本型 | +| position | 图片的对齐方式,填写格式为 “方向 方向”(方向 空格 方向) | 文本型 | +| desktopHeightVh | 桌面端 Banner 高度占比,譬如上例代表 Banner 高度占页面可视高度的 55% | 数值型 | +| mobileHeightVh | 移动端 Banner 高度占比 | 数值型 | +| overlay | 横幅上方黑色遮罩的透明度。此功能是为了防止 Banner 图过亮导致遮挡文字。0 为完全没有遮罩,1 为暗到纯黑。 | 小数型 | +| textTone | Banner 文字的色调。推荐保持 `auto`,这样 Banner 文字就能够根据图片的亮暗来调整文字的颜色。如果实在需要,可选 `light`、`Dark`。 | 文本型 | + +## 文章卡片默认封面图 + +`cards`块代表文章卡片设置。示例代码如下: + +```ts + cards: { + defaultCovers: ['https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=1600&q=80'] + }, +``` + +其中,defaultCovers 是一个 JSON 数组,你可以往里面填写一个多个图片的地址。当有文章未设置封面,且文章里没有图片可被自动设为封面时,系统会从 defaultCovers 里随机抽选一个图片作为封面。 + +## 页脚 + +`footer`块代表页脚部分。示例代码如下: + +```ts + footer: { + copyright: `© 2023-${new Date().getFullYear()} 你的名字`, // 记得把"你的名字"改成你自己的名字。 + // 外链(如果有) + links: [ + { label: 'BlogsClub', href: 'https://blogs.club', external: true } + ] + }, +``` + +首先,你需要把 Copyright 中的“你的名字”改为你自己的名字。 + +其次,如果你有外链需求(比如加入了某博客组织),你可以在 links 这个 JSON 数组里添加外链。`external`代表是否在新标签页打开。 + +## 评论系统 + +Eidolon 支持使用 Twikoo 作为评论系统。你只需要自行部署 Twikoo 云函数并获取 envID,将其填写到 comments: envID 中即可。 + +如果你不需要评论系统,只需将 comments: provider 改为 `none`,然后删除 comments 里剩余的子项即可。 + +## 顶栏/侧栏按钮自定义 + +Eidolon 支持自定义按钮。该按钮项目会在顶栏和侧栏同步显示。 + +示例代码如下: + +```ts + toolbarItems: [ + { type: 'search', icon: 'search', name: '搜索文章' }, + { type: 'rss', icon: 'rss', name: 'RSS 订阅', href: '/rss.xml' }, + { type: 'settings', icon: 'settings', name: '阅读设置' } + ] +``` + +其中,`search`、`rss`、`settings`这三个 type 都是系统自带的按钮类型,分别对应搜索按钮、RSS 按钮、阅读设置按钮。其分别具有独立的功能,不建议删除。 + +如果你要新增带图标的外链按钮,需要经历以下这几步: + +### 选择图标 + +Eidolon 使用 [Lucide](https://lucide.dev/icons/) 图标库。先前往该站点选择你要使用的图标,并将其名称复制下来。 + +### 注册图标名称 + +编辑 `src/types/config.ts`,第 18 行,有一个 + +```ts +export type ToolbarIcon = 'search' | 'rss' | 'settings' | 'link' | 'tram-front'; +``` + +只需要将你要添加的图标名称,规范地加在 ToolbarIcon 后面即可。 + +譬如我新增了一个名为 check 的图标,那么我修改后的代码就是: + +```ts +export type ToolbarIcon = 'search' | 'rss' | 'settings' | 'link' | 'tram-front' | 'check'; +``` + +### 导入并建立映射 + +编辑 `/src/components/ToolbarIcon.astro`,第 2 行 + +```ts +import { Link, Rss, Search, TramFront, Type } from '@lucide/astro'; +``` + +在这个数组的最前方添加你的图标名称。同上例,如果我要添加名为 check 的图标,那么实际代码就是: + +```ts +import { Check, Link, Rss, Search, TramFront, Type } from '@lucide/astro'; +``` + +是的,在第 2 行添加图标名时,需要将图标名首字母大写。 + +接下来看到第 7 行: + +```ts +const icons = { link: Link, rss: Rss, search: Search, settings: Type, 'tram-front': TramFront } as const; +``` + +只需要在数组的末端加入`图标名(首字母小写): 图标名(首字母大写)`,即可。 + +同上例,加入 check 这个图标后,代码应为: + +```ts +const icons = { link: Link, rss: Rss, search: Search, settings: Type, 'tram-front': TramFront, check: Check } as const; +``` + +### 添加按钮 + +回到 site.config.ts,在 toolbarItems 里加入自定义链接按钮。 + +譬如我添加的是开往,图标名是`tram-front`,那么我的代码就是这样的: + +```json +{ type: 'link', icon: 'tram-front', name: '开往', href: 'https://www.travellings.cn/plain.html', external: true }, +``` + +其中,type: 'link' 定义了这是一个自定义链接;icon 制定了我想要的图标;name 就是鼠标悬浮之上时显示的气泡标题;href 即自定义外链跳转的的地址;external 即是否在新标签页中打开。 + +--- + +至此,Eidolon 的自定义教程结束。 diff --git a/src/content/posts/markdown-test.md b/src/content/posts/markdown-test.md deleted file mode 100644 index f112a6b..0000000 --- a/src/content/posts/markdown-test.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: "Markdown 排版测试" -description: "用于检查主题中常见 Markdown 元素的完整排版效果。" -pubDate: "2026-08-11T00:00:00.000Z" -categories: ['测试分类'] -tags: ['测试标签'] -slug: "markdown-test" -draft: false -comments: false -math: true -mermaid: true -toc: true ---- - -# 一级标题 - -这是一篇用于检查主题排版的测试文章,涵盖常用 Markdown、GFM、数学公式和 Mermaid 图表。 - -## 二级标题 - -### 三级标题 - -#### 四级标题 - -##### 五级标题 - -###### 六级标题 - -## 文本样式 - -普通文本、**粗体文本**、*斜体文本*、***粗斜体文本***、~~删除线文本~~、`行内代码`。 - -这是第一行,行末使用两个空格强制换行。 -这是第二行。 - -特殊字符可以转义:\*星号\*、\# 井号、\[方括号\]。 - -## 链接与图片 - -这是[行内链接](https://astro.build/),这是使用引用的[参考链接][astro],也可以自动识别 。 - -![Astro 标志测试图](/favicon.svg "图片标题") - -[astro]: https://astro.build/ "Astro" - -## 引用 - -> 这是一段引用。 -> -> > 这是嵌套引用,其中包含 **粗体** 和 `代码`。 - -## 列表 - -- 无序列表第一项 -- 无序列表第二项 - - 二级列表 - - 三级列表 - -1. 有序列表第一项 -2. 有序列表第二项 - 1. 二级有序列表 - 2. 另一项 - -- [x] 已完成任务 -- [ ] 未完成任务 - -## 代码 - -行内代码示例:`const message = 'Hello, Astro';`。 - -```ts -interface Post { - title: string; - published: boolean; -} - -const post: Post = { - title: 'Markdown 排版测试', - published: true -}; - -console.log(post.title); -``` - -```diff -- const theme = 'old'; -+ const theme = 'Eidolon'; -``` - - 这是使用四个空格缩进的代码块。 - -## 表格 - -| 左对齐 | 居中 | 右对齐 | -| :--- | :---: | ---: | -| 文本 | **粗体** | 100 | -| `code` | [链接](https://astro.build/) | 200 | - -## 分隔线 - ---- - -分隔线前后的正文用于检查垂直间距。 - -## 脚注 - -这句话包含一个脚注。[^note] - -[^note]: 这是脚注内容,其中也可以包含 **Markdown**。 - -## 数学公式 - -行内公式:$E = mc^2$。 - -块级公式: - -$$ -\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi} -$$ - -## Mermaid 图表 - -```mermaid -flowchart LR - A[Markdown] --> B{渲染成功?} - B -->|是| C[完成] - B -->|否| D[检查样式] -``` - -## HTML 元素 - -
- 展开原生 HTML 内容 -

这是一段位于 details 元素中的内容。

-
- -Ctrl + K - -## 主题短代码 - -[hint type="info" title="信息提示"] -这是一个信息提示块,包含 **Markdown 文本**。 -[/hint] - -[collapse title="折叠内容"] -这里是折叠区域中的内容。 - -- 列表项目 -- 另一项目 -[/collapse] - -[tabs title="选项卡测试"] -[tab name="选项一" selected] -第一个选项卡的内容。 -[/tab] -[tab name="选项二"] -第二个选项卡的内容。 -[/tab] -[/tabs] - -[button href="https://astro.build/"]访问 Astro[/button] - -[tag type="success"]成功标签[/tag] - -## 段落收尾 - -最后一段用于观察文章底部留白、正文行高以及中英文混排效果。The quick brown fox jumps over the lazy dog. 0123456789。 diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 765c616..b18ef18 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -10,12 +10,11 @@ import NavigationProgress from '@/components/NavigationProgress.astro'; import { ClientRouter } from 'astro:transitions'; import '../styles/global.css'; -interface Props { title?: string; description?: string; image?: string; type?: 'website' | 'article'; noindex?: boolean; math?: boolean; navbarOverlay?: boolean; } -const { title, description, image, type, noindex, math, navbarOverlay = false } = Astro.props; -const hasMasthead = Astro.slots.has('masthead'); +interface Props { title?: string; description?: string; image?: string; type?: 'website' | 'article'; noindex?: boolean; math?: boolean; navbarOverlay?: boolean; hasMasthead?: boolean; } +const { title, description, image, type, noindex, math, navbarOverlay = false, hasMasthead = Astro.slots.has('masthead') } = Astro.props; const appearanceScript = `(function(){var r=document.documentElement,t='mirages-theme',s='mirages-font-scale',f='mirages-font-family',themes=['auto','light','sunset','dark'],fonts=['serif','sans'],stored=Number(localStorage.getItem(s)),scale=stored>=.8&&stored<=1.5?stored*100:stored>=80&&stored<=150?stored:100,theme=localStorage.getItem(t),font=localStorage.getItem(f);scale=Math.round(scale/5)*5;r.dataset.theme=themes.indexOf(theme)>-1?theme:'${siteConfig.appearance.defaultTheme}';r.dataset.font=fonts.indexOf(font)>-1?font:'sans';r.dataset.platform=/Win/.test(navigator.userAgentData?.platform||navigator.platform)?'windows':'other';r.style.fontSize=scale+'%'})();`; - const tabsScript = `document.addEventListener('click',function(event){var button=event.target.closest('[data-shortcode-tab]');if(!button)return;var group=button.closest('[data-shortcode-tabs]');var id=button.dataset.shortcodeTab;group.querySelectorAll('[data-shortcode-tab="'+id+'"]').forEach(function(tab){var active=tab===button;tab.setAttribute('aria-selected',String(active));tab.tabIndex=active?0:-1;var panel=group.querySelector('#'+tab.getAttribute('aria-controls'));if(panel)panel.hidden=!active;});});`; - const collapseScript = `document.querySelectorAll('.shortcode-collapse').forEach(function(details){details.dataset.collapseReady='';details.classList.toggle('is-expanded',details.open);var body=details.querySelector(':scope>.shortcode-body');if(body instanceof HTMLElement&&details.open)body.style.height='auto';});document.addEventListener('click',function(event){var summary=event.target.closest('.shortcode-collapse>summary');if(!summary)return;var details=summary.parentElement;if(!(details instanceof HTMLDetailsElement))return;event.preventDefault();var body=details.querySelector(':scope>.shortcode-body');if(!(body instanceof HTMLElement))return;var expand=!details.classList.contains('is-expanded');details.classList.toggle('is-expanded',expand);if(matchMedia('(prefers-reduced-motion: reduce)').matches){details.open=expand;body.style.height=expand?'auto':'';delete details.dataset.animating;return;}var height=body.getBoundingClientRect().height;details.open=true;body.style.height=height+'px';void body.offsetHeight;details.dataset.animating='true';body.style.height=(expand?body.scrollHeight:0)+'px';});document.addEventListener('transitionend',function(event){var body=event.target;if(!(body instanceof HTMLElement)||!body.classList.contains('shortcode-body')||event.propertyName!=='height')return;var details=body.parentElement;if(!(details instanceof HTMLDetailsElement))return;var expanded=details.classList.contains('is-expanded');details.open=expanded;body.style.height=expanded?'auto':'';delete details.dataset.animating;});`; + const tabsScript = `if(!window.__tabsInit){window.__tabsInit=true;document.addEventListener('click',function(event){var button=event.target.closest('[data-shortcode-tab]');if(!button)return;var group=button.closest('[data-shortcode-tabs]');var id=button.dataset.shortcodeTab;group.querySelectorAll('[data-shortcode-tab=\"'+id+'\"]').forEach(function(tab){var active=tab===button;tab.setAttribute('aria-selected',String(active));tab.tabIndex=active?0:-1;var panel=group.querySelector('#'+tab.getAttribute('aria-controls'));if(panel)panel.hidden=!active;});});}`; + const collapseScript = `function initCollapse(){document.querySelectorAll('.shortcode-collapse').forEach(function(details){details.dataset.collapseReady='';details.classList.toggle('is-expanded',details.open);var body=details.querySelector(':scope>.shortcode-body');if(body instanceof HTMLElement&&details.open)body.style.height='auto';});}initCollapse();document.addEventListener('astro:page-load',initCollapse);document.addEventListener('click',function(event){var summary=event.target.closest('.shortcode-collapse>summary');if(!summary)return;var details=summary.parentElement;if(!(details instanceof HTMLDetailsElement))return;event.preventDefault();var body=details.querySelector(':scope>.shortcode-body');if(!(body instanceof HTMLElement))return;var expand=!details.classList.contains('is-expanded');details.classList.toggle('is-expanded',expand);if(matchMedia('(prefers-reduced-motion: reduce)').matches){details.open=expand;body.style.height=expand?'auto':'';delete details.dataset.animating;return;}var height=body.getBoundingClientRect().height;details.open=true;body.style.height=height+'px';void body.offsetHeight;details.dataset.animating='true';body.style.height=(expand?body.scrollHeight:0)+'px';});document.addEventListener('transitionend',function(event){var body=event.target;if(!(body instanceof HTMLElement)||!body.classList.contains('shortcode-body')||event.propertyName!=='height')return;var details=body.parentElement;if(!(details instanceof HTMLDetailsElement))return;var expanded=details.classList.contains('is-expanded');details.open=expanded;body.style.height=expanded?'auto':'';delete details.dataset.animating;});`; --- @@ -51,10 +50,35 @@ const hasMasthead = Astro.slots.has('masthead'); diff --git a/src/lib/notice-shortcode.ts b/src/lib/notice-shortcode.ts new file mode 100644 index 0000000..c9b4181 --- /dev/null +++ b/src/lib/notice-shortcode.ts @@ -0,0 +1,52 @@ +const NOTICE_ICON = { + type: 'element', + tagName: 'span', + properties: { className: ['shortcode-notice'], ariaLabel: '警告' }, + children: [{ + type: 'element', + tagName: 'svg', + properties: { + ariaHidden: 'true', + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + strokeWidth: 2, + strokeLinecap: 'round', + strokeLinejoin: 'round', + }, + children: [ + { type: 'element', tagName: 'circle', properties: { cx: 12, cy: 12, r: 10 }, children: [] }, + { type: 'element', tagName: 'path', properties: { d: 'M12 8v4' }, children: [] }, + { type: 'element', tagName: 'path', properties: { d: 'M12 16h.01' }, children: [] }, + ], + }], +}; + +function cloneNoticeIcon() { + return structuredClone(NOTICE_ICON); +} + +export function applyNoticeShortcodes(tree: any) { + const transform = (node: any) => { + if (!Array.isArray(node.children) || node.tagName === 'code' || node.tagName === 'pre') return; + const output: any[] = []; + for (const child of node.children) { + if (child.type !== 'text' || !child.value.includes('[!/]')) { + transform(child); + output.push(child); + continue; + } + const parts = child.value.split('[!/]'); + parts.forEach((part: string, index: number) => { + if (part) output.push({ type: 'text', value: part }); + if (index < parts.length - 1) output.push({ type: 'text', value: '\u00a0' }, cloneNoticeIcon(), { type: 'text', value: '\u00a0' }); + }); + } + node.children = output; + }; + transform(tree); +} + +export default function noticeShortcode() { + return (tree: any) => applyNoticeShortcodes(tree); +} diff --git a/src/lib/responsive-tables.ts b/src/lib/responsive-tables.ts new file mode 100644 index 0000000..961d800 --- /dev/null +++ b/src/lib/responsive-tables.ts @@ -0,0 +1,25 @@ +import { SKIP, visit } from 'unist-util-visit'; + +export function applyResponsiveTables(tree: any) { + visit(tree, 'element', (node: any, index: number | undefined, parent: any) => { + if (node.tagName !== 'table' || index === undefined || !parent) return; + const classes = Array.isArray(node.properties?.className) ? node.properties.className : []; + if (classes.includes('responsive-table')) return; + + const section = node.children?.find((child: any) => child.tagName === 'thead' || child.tagName === 'tbody'); + const row = section?.children?.find((child: any) => child.tagName === 'tr'); + const columns = Math.max(1, row?.children?.filter((child: any) => child.tagName === 'th' || child.tagName === 'td').length ?? 1); + node.properties = { ...node.properties, className: [...classes, 'responsive-table'] }; + parent.children[index] = { + type: 'element', + tagName: 'div', + properties: { className: ['table-scroll'], style: `--table-columns:${columns}` }, + children: [node], + }; + return SKIP; + }); +} + +export default function responsiveTables() { + return (tree: any) => applyResponsiveTables(tree); +} diff --git a/src/lib/shortcodes.ts b/src/lib/shortcodes.ts index d7b798e..dcf60c1 100644 --- a/src/lib/shortcodes.ts +++ b/src/lib/shortcodes.ts @@ -5,10 +5,18 @@ import { toHast } from 'mdast-util-to-hast'; import { gfm } from 'micromark-extension-gfm'; import { visit } from 'unist-util-visit'; import { applyExternalLinks } from './external-links'; +import { applyResponsiveTables } from './responsive-tables'; +import { applyNoticeShortcodes } from './notice-shortcode'; const URL_SCHEME = /^(https?:|mailto:|tel:)/i; const TAG_TYPES = new Set(['primary', 'success', 'warning', 'danger', 'info', 'default']); const HINT_TYPES = new Set(['warn', 'warning', 'error', 'danger', 'success', 'info']); +const HINT_ICONS: Record = { + info: '', + warning: '', + danger: '', + success: '', +}; const BLOCK_NAMES = new Set(['hint', 'tip', 'collapse', 'tabs', 'tools']); const INLINE_NAMES = new Set(['button', 'btn', 'file', 'tag', 'label']); type GithubData = { stars?: string; forks?: string; description?: string; commitDate?: string; htmlUrl?: string; defaultBranch?: string }; @@ -61,12 +69,44 @@ function normalizeMarkdownHeadings(source: string): string { }).join('\n'); } -function markdown(source: string, preserveHtml = false): string { +function markdown(source: string, preserveHtml = true, lineNumbers = true): string { const normalized = normalizeMarkdownHeadings(source); const tree = fromMarkdown(normalized, { extensions: [gfm()], mdastExtensions: [gfmFromMarkdown()] }); transform(tree, normalized); if (!preserveHtml) visit(tree, 'html', (node: any) => { if (!node.data?.shortcode) node.value = ''; }); const hast = toHast(tree, { allowDangerousHtml: true }) as any; + if (lineNumbers) { + visit(hast, 'element', (node: any) => { + if (node.tagName !== 'pre') return; + const code = node.children?.find((child: any) => child.type === 'element' && child.tagName === 'code'); + if (!code) return; + const classes = Array.isArray(node.properties?.className) ? node.properties.className : []; + if (!classes.includes('astro-code')) classes.push('astro-code'); + if (!classes.includes('shortcode-code')) classes.push('shortcode-code'); + if (!classes.includes('no-pangu-spacing')) classes.push('no-pangu-spacing'); + node.properties = { ...node.properties, className: classes }; + if (code.children?.every((child: any) => child.type === 'text')) { + const value = code.children.map((child: any) => child.value).join(''); + const text = value.endsWith('\n') ? value.slice(0, -1) : value; + const lines = text.split('\n'); + code.children = lines.map((line: string) => ({ + type: 'element', + tagName: 'span', + properties: { className: ['line'] }, + children: [ + { + type: 'element', + tagName: 'span', + properties: { className: ['line-content'] }, + children: line ? [{ type: 'text', value: line }] : [{ type: 'text', value: '\n' }], + } + ], + })); + } + }); + } + applyNoticeShortcodes(hast); + applyResponsiveTables(hast); if (siteUrl) applyExternalLinks(hast, siteUrl); return toHtml(hast, { allowDangerousHtml: true }); } @@ -77,33 +117,41 @@ export function renderMarkdown(source: string): string { function renderBlock(name: string, args: Record, body = ''): string { const label = args.title ?? args.name ?? args.text ?? body.trim().split('\n')[0] ?? ''; - if (name === 'button' || name === 'btn' || name === 'file') { + if (name === 'button' || name === 'btn') { const url = safeUrl(args.href ?? args.url ?? args.link); if (!url) return `${escape(label || '链接不可用')}`; return `${inline(label || url)}`; } + if (name === 'file') { + const url = safeUrl(args.href ?? args.url ?? args.link); + if (!url) return `${escape(label || '文件链接不可用')}`; + const icon = ''; + return `${icon}${inline(label || url)}`; + } if (name === 'tag' || name === 'label') { const type = TAG_TYPES.has(args.type ?? '') ? args.type : 'default'; const outline = args.outline !== undefined ? ' shortcode-tag-outline' : ''; return `${inline(label)}`; } if (name === 'hint' || name === 'tip') { - const type = HINT_TYPES.has(args.type ?? '') ? args.type : 'info'; - const title = args.title ? `${inline(args.title)}` : ''; - return ``; + const requestedType = args.type ?? [...HINT_TYPES].find((candidate) => args[candidate] !== undefined); + const type = requestedType === 'warn' ? 'warning' : requestedType === 'error' ? 'danger' : HINT_TYPES.has(requestedType ?? '') ? requestedType : 'info'; + const icon = ``; + const heading = args.title ? `
${icon}

${inline(args.title)}

` : icon; + return ``; } if (name === 'collapse') { const open = args.open !== undefined || args.expanded !== undefined ? ' open' : ''; - return `
${inline(label || '展开内容')}
${markdown(body, true)}
`; + return `
${inline(label || '展开内容')}
${markdown(body, true, true)}
`; } if (name === 'tabs') { const parsed = parseBlocks(body); const tabs = parsed.filter((item) => item.name === 'tab'); - if (!tabs.length) return `
${inline(label || '展开内容')}
${markdown(body)}
`; + if (!tabs.length) return `
${inline(label || '展开内容')}
${markdown(body, true, true)}
`; const id = `shortcode-tabs-${tabs.length}-${Math.random().toString(36).slice(2, 8)}`; const selected = Math.max(0, tabs.findIndex((tab) => tab.args.selected !== undefined)); const buttons = tabs.map((tab, index) => ``).join(''); - const panels = tabs.map((tab, index) => `
${markdown(tab.body)}
`).join(''); + const panels = tabs.map((tab, index) => `
${markdown(tab.body, true, true)}
`).join(''); return `
${buttons}
${panels}
`; } if (name === 'tools') { @@ -151,8 +199,28 @@ function renderBlock(name: string, args: Record, body = ''): str function parseBlocks(source: string): Array<{ name: string; args: Record; body: string }> { const result: Array<{ name: string; args: Record; body: string }> = []; - const pattern = /^\[tab([^\]]*)\]\s*\n?([\s\S]*?)^\[\/tab\]\s*$/gm; - for (const match of source.matchAll(pattern)) result.push({ name: 'tab', args: attrs(match[1]), body: match[2] }); + let fence: string | null = null; + let opening: { args: Record; bodyStart: number } | null = null; + for (const line of source.matchAll(/^[^\n]*(?:\n|$)/gm)) { + const text = line[0].trim(); + const start = line.index!; + const fenceMatch = text.match(/^(`{3,}|~{3,})/); + if (fenceMatch) { + if (!fence) fence = fenceMatch[1][0]; + else if (fenceMatch[1][0] === fence) fence = null; + continue; + } + if (fence) continue; + + const closing = text.match(/^\[\/tab\]\s*$/i); + if (closing && opening) { + result.push({ name: 'tab', args: opening.args, body: source.slice(opening.bodyStart, start) }); + opening = null; + continue; + } + const openingMatch = text.match(/^\[tab([^\]]*)\]\s*$/i); + if (openingMatch && !opening) opening = { args: attrs(openingMatch[1]), bodyStart: start + line[0].length }; + } return result; } @@ -220,15 +288,9 @@ function findBlocks(source: string): Array<{ name: string; args: Record { - replacedNotice = true; - return `${inline(body)}`; - }); - const shortcode = /\[(button|btn|file|tag|label)([^\]]*)\]([\s\S]*?)\[\/\1\]/gi; + const shortcode = /\[(button|btn|file|tag|label|hint|tip)([^\]]*)\]([\s\S]*?)\[\/\1\]/gi; const replacedShortcode = shortcode.test(source); - if (!replacedNotice && !replacedShortcode) return null; + if (!replacedShortcode) return null; return source.replace(shortcode, (_match, name, rawArgs, body) => renderBlock(name.toLowerCase(), attrs(rawArgs), body)); } @@ -268,6 +330,7 @@ function transform(tree: any, raw = '') { const output: any[] = []; for (const node of root.children) { if (node.type !== 'paragraph' && node.type !== 'html') { output.push(node); continue; } + if (node.type === 'html' && node.data?.shortcode) { output.push(node); continue; } const source = node.type === 'html' ? node.value : node.position ? raw.slice(node.position.start.offset, node.position.end.offset) : ''; const replaced = replaceInline(source.trim()); output.push(replaced ? { type: 'html', value: replaced, data: { shortcode: true } } : node); diff --git a/src/pages/archives/index.astro b/src/pages/archives/index.astro index d50160e..2926ba6 100644 --- a/src/pages/archives/index.astro +++ b/src/pages/archives/index.astro @@ -12,7 +12,7 @@ const tags = deriveTaxonomy(posts, 'tags') const visibleTags = tagLimit === 0 ? tags : tags.slice(0, Math.max(0, tagLimit)); --- - +
diff --git a/src/pages/index.astro b/src/pages/index.astro index c3355a7..35532f6 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -8,7 +8,7 @@ const posts = await getPublicPosts(); const total = Math.max(1, Math.ceil(posts.length / POSTS_PER_PAGE)); --- - - + + {siteConfig.banner.enabled && } diff --git a/src/pages/links/index.astro b/src/pages/links/index.astro new file mode 100644 index 0000000..b14b5c9 --- /dev/null +++ b/src/pages/links/index.astro @@ -0,0 +1,90 @@ +--- +import { getCollection } from 'astro:content'; +import BaseLayout from '@/layouts/BaseLayout.astro'; +import Masthead from '@/components/Masthead.astro'; +import { renderMarkdown } from '@/lib/shortcodes'; + +const page = (await getCollection('pages')).find((entry) => entry.data.slug === 'links'); +if (!page) throw new Error('Missing links page content.'); +type Link = { name: string; url: string; avatar: string; description: string }; +type Section = { name: string; links: Link[]; contentLines: string[] }; +const sections: Section[] = [{ name: '其他', links: [], contentLines: [] }]; +let section = sections[0]; +let shortcodeDepth = 0; +const escapeHtml = (value: string) => value.replace(/[&<>"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[character]!); +const renderNestedCard = (link: Link) => ``; +for (const line of (page.body ?? '').split(/\r?\n/)) { + if (/^\s*\[(?:collapse|hint|tip|tabs)\b[^\]]*\]\s*$/i.test(line)) { + shortcodeDepth += 1; + section.contentLines.push(line); + continue; + } + if (/^\s*\[\/(?:collapse|hint|tip|tabs)\]\s*$/i.test(line)) { + shortcodeDepth = Math.max(0, shortcodeDepth - 1); + section.contentLines.push(line); + continue; + } + const heading = line.match(/^##\s+(.+?)\s*#*$/); + if (heading && shortcodeDepth === 0) { + section = { name: heading[1].trim(), links: [], contentLines: [] }; + sections.push(section); + continue; + } + const link = line.match(/^\s*\[([^\]]+)\]\(([^)]+)\)\+\(([^)]+)\)\/\((.*)\)\s*$/) + ?? line.match(/^\s*\[([^\]]+)\]\(([^)]+)\)\+\(([^)]+)\)\/(.*?)\s*\)?$/); + if (link && shortcodeDepth === 0) { + section.links.push({ name: link[1], url: link[2], avatar: link[3], description: link[4] }); + continue; + } + section.contentLines.push(shortcodeDepth > 0 && link ? renderNestedCard({ name: link[1], url: link[2], avatar: link[3], description: link[4] }) : line); +} +if (!sections[0].links.length && !sections[0].contentLines.some((line) => line.trim())) sections.shift(); +--- + + + + + + + diff --git a/src/pages/page/[page].astro b/src/pages/page/[page].astro index 557345d..6054fc7 100644 --- a/src/pages/page/[page].astro +++ b/src/pages/page/[page].astro @@ -14,7 +14,7 @@ export async function getStaticPaths() { } const { posts, page, total } = Astro.props; --- - - + + {siteConfig.banner.enabled && } diff --git a/src/site.config.ts b/src/site.config.ts index 4c85d25..e50dd96 100644 --- a/src/site.config.ts +++ b/src/site.config.ts @@ -2,12 +2,12 @@ import type { SiteConfig } from './types/config'; export const siteConfig: SiteConfig = { site: { - title: '路明笔记', - description: '一名高中生的技术与生活博客', + title: 'Eidolon', + description: '一款轻量、简洁且美观的 Astro 主题', author: { - name: 'RiseForever', - avatar: 'https://weavatar.com/avatar/302380667bdaf4e1390800e62494d4af?s=512&r=G', - bio: '不慌张,不绝望,不狂妄,不投降。', + name: 'Eidolon', + avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&w=400&h=400&q=85', + bio: '一款轻量、简洁且美观的 Astro 主题', rotateAvatar: true }, locale: 'zh-CN', @@ -17,7 +17,8 @@ export const siteConfig: SiteConfig = { navigation: [ { label: '首页', href: '/', external: false }, { label: '归档', href: '/archives/', external: false }, - { label: '测试页面', href: '/test-page/', external: false } + { label: '友人', href: '/links/', external: false }, + { label: '关于', href: '/about/', external: false } ], pjax: { enabled: true @@ -28,9 +29,9 @@ export const siteConfig: SiteConfig = { }, banner: { enabled: true, - title: '路明笔记', - subtitle: '一名高中生的技术与生活博客', - image: 'https://image.luming.cool/i/2026/07/26/6a6628967fe03.webp', + title: 'Eidolon', + subtitle: '一款轻量、简洁且美观的 Astro 主题', + image: 'https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=2000&q=85', position: 'center center', desktopHeightVh: 55, mobileHeightVh: 40, @@ -38,34 +39,31 @@ export const siteConfig: SiteConfig = { textTone: 'auto' }, cards: { - defaultCovers: ['https://image.luming.cool/i/2026/08/03/6a6f79cc091ac.webp'] + defaultCovers: ['https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=1600&q=80'] }, archives: { tagLimit: 30 }, footer: { - copyright: `© 2023-${new Date().getFullYear()} RiseForever`, + copyright: `© 2023-${new Date().getFullYear()} 你的名字`, // 记得把"你的名字"改成你自己的名字。 + // 外链(如果有) links: [ - { label: 'BlogsClub', href: 'https://blogs.quest/luming', external: true }, - { label: '笔墨迹', href: 'https://blogscn.fun/blogs/01k7zk4mhndsr6atqd1wm11f7b', external: true }, - { label: '十年之约', href: 'https://www.foreverblog.cn/blog/6506.html', external: true }, - { label: '博友圈', href: 'https://www.boyouquan.com/blogs/luming.cool', external: true }, - { label: '好站网', href: 'https://haozhan.wang/site_detail.php?id=176', external: true }, - { label: '集博栈', href: 'https://www.heyblog.net/site/019eff04-b025-76c9-b8f2-388deb7195cd', external: true }, - { label: '博客大联盟', href: 'https://bo.ke/luming.cool/', external: true } + { label: 'BlogsClub', href: 'https://blogs.club', external: true } ] }, + // 评论系统采用 Twikoo,请自行部署云函数后,并在下方填写你的云函数 URL comments: { provider: 'twikoo', - envId: 'https://twokii.luming.cool/', + envId: 'https://link.to.your.twikoo.service/', region: 'cn', lang: 'zh-CN' }, + // 搜索服务默认使用 PageFind,无需理会 search: { provider: 'pagefind', placeholder: '搜索文章' }, + // 这是顶栏右上角及侧栏底部的工具按钮,可自定义。下方示例已涵盖了站内功能、RSS 复制、外链跳转等场景。 toolbarItems: [ { type: 'search', icon: 'search', name: '搜索文章' }, { type: 'rss', icon: 'rss', name: 'RSS 订阅', href: '/rss.xml' }, - { type: 'link', icon: 'tram-front', name: '开往', href: 'https://www.travellings.cn/plain.html', external: true }, { type: 'settings', icon: 'settings', name: '阅读设置' } ] }; diff --git a/src/styles/content.css b/src/styles/content.css index 7ba1a59..cab4417 100644 --- a/src/styles/content.css +++ b/src/styles/content.css @@ -131,54 +131,88 @@ font-family: var(--mirages-font-code); font-size: .875rem; line-height: 1.45; + white-space: pre; +} + +.prose .astro-code { + --code-line-digits: 1; + --code-gutter-background: color-mix(in srgb, var(--color-code) 65%, var(--color-border)); + padding: 0; + overflow: hidden; + position: relative; + background: var(--color-code); } .prose .astro-code code { - --code-line-digits: 1; display: block; + position: relative; + overflow-x: auto; + overflow-y: hidden; + overscroll-behavior-x: none; + width: 100%; + min-width: 0; padding-block: 1rem; counter-reset: code-line; - font-size: 0; + font-size: .875rem; + line-height: 1.45; + scrollbar-color: color-mix(in srgb, var(--color-muted) 60%, transparent) transparent; + scrollbar-width: thin; + white-space: normal; } -.prose .astro-code code:has(.line:nth-child(10)) { --code-line-digits: 2; } -.prose .astro-code code:has(.line:nth-child(100)) { --code-line-digits: 3; } -.prose .astro-code code:has(.line:nth-child(1000)) { --code-line-digits: 4; } +.prose .astro-code code::-webkit-scrollbar { height: 8px; } +.prose .astro-code code::-webkit-scrollbar-thumb { border-radius: 4px; background: color-mix(in srgb, var(--color-muted) 60%, transparent); } +.prose .astro-code code::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--color-muted) 78%, transparent); } + +.prose .astro-code:has(.line:nth-child(10)) { --code-line-digits: 2; } +.prose .astro-code:has(.line:nth-child(100)) { --code-line-digits: 3; } +.prose .astro-code:has(.line:nth-child(1000)) { --code-line-digits: 4; } + +.prose .astro-code .code-line-numbers { + position: absolute; + left: 0; + top: 0; + bottom: 0; + z-index: 20; + display: block; + width: calc(var(--code-line-digits) * 1ch + 2rem); + padding-block: 1rem; + font-family: var(--mirages-font-code); + font-size: .875rem; + line-height: 1.45; + background: var(--code-gutter-background); + border-right: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent); + box-sizing: border-box; + color: var(--color-muted); + font-variant-numeric: tabular-nums; + text-align: right; + user-select: none; + pointer-events: none; +} + +.prose .astro-code .code-line-numbers > span { + display: block; + height: 1.45em; + padding-inline: 1rem; + box-sizing: border-box; + color: inherit; +} .prose .astro-code .line { - display: flex; + display: block; + width: max-content; + min-width: 100%; min-height: 1.45em; + padding-left: calc(var(--code-line-digits) * 1ch + 3rem); + box-sizing: border-box; counter-increment: code-line; font-size: .875rem; line-height: 1.45; + white-space: pre; } .prose .astro-code .line::before { - display: inline-block; - width: calc(var(--code-line-digits) * 1ch + 2rem); - flex: 0 0 calc(var(--code-line-digits) * 1ch + 2rem); - margin-right: 1rem; - padding-inline: 1rem; - background: var(--color-code-gutter); - box-sizing: border-box; - color: var(--color-muted); - content: counter(code-line); - font-variant-numeric: tabular-nums; - opacity: 0.72; - text-align: right; - user-select: none; -} - -.prose .astro-code .line:first-child::before { - box-shadow: 0 -1rem var(--color-code-gutter); -} - -.prose .astro-code .line:last-child::before { - box-shadow: 0 1rem var(--color-code-gutter); -} - -.prose .astro-code .line:only-child::before { - box-shadow: 0 -1rem var(--color-code-gutter), 0 1rem var(--color-code-gutter); + content: none; } .prose .astro-code span { @@ -186,6 +220,8 @@ } :root[data-theme='dark'] .prose .astro-code { + --code-gutter-background: var(--color-code-gutter); + --shortcode-code-gutter: var(--color-code-gutter); background-color: var(--color-code); color: var(--shiki-dark); } @@ -196,6 +232,8 @@ @media (prefers-color-scheme: dark) { :root[data-theme='auto'] .prose .astro-code { + --code-gutter-background: var(--color-code-gutter); + --shortcode-code-gutter: var(--color-code-gutter); background-color: var(--color-code); color: var(--shiki-dark); } @@ -205,9 +243,47 @@ } } -.prose .astro-code { +.shortcode-code { + --shortcode-code-gutter: color-mix(in srgb, var(--color-code) 65%, var(--color-border)); padding: 0; - background: var(--color-code); + overflow: hidden; + position: relative; +} + +.shortcode-code code { + display: block; + position: relative; + overflow-x: auto; + overflow-y: hidden; + overscroll-behavior-x: none; + width: 100%; + min-width: 0; + padding-block: 1rem; + font-size: .875rem; + line-height: 1.45; + scrollbar-color: color-mix(in srgb, var(--color-muted) 60%, transparent) transparent; + scrollbar-width: thin; + white-space: normal; +} + +.shortcode-code code::-webkit-scrollbar { height: 8px; } +.shortcode-code code::-webkit-scrollbar-thumb { border-radius: 4px; background: color-mix(in srgb, var(--color-muted) 60%, transparent); } +.shortcode-code code::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--color-muted) 78%, transparent); } + +.shortcode-code .line { + display: block; + width: max-content; + min-width: 100%; + min-height: 1.45em; + padding-left: 4rem; + box-sizing: border-box; + font-size: .875rem; + line-height: 1.45; + white-space: pre; +} + +.shortcode-code .shortcode-line-number { + display: none; } .prose .katex-display { max-width: 100%; overflow-x: auto; overflow-y: hidden; padding-block: .35em; } @@ -215,9 +291,25 @@ .prose .mermaid { max-width: 100%; overflow-x: auto; overflow-y: hidden; padding: 1rem 0; } .prose .mermaid svg { max-width: none; height: auto; } +.prose .table-scroll { + width: 100%; + max-width: 100%; + margin: 1.25em 0; + overflow-x: auto; + overscroll-behavior-inline: contain; + scrollbar-color: color-mix(in srgb, var(--color-muted) 60%, transparent) transparent; + scrollbar-width: thin; +} + +.prose .table-scroll::-webkit-scrollbar { height: 8px; } +.prose .table-scroll::-webkit-scrollbar-thumb { border-radius: 4px; background: color-mix(in srgb, var(--color-muted) 60%, transparent); } + .prose table { width: 100%; + max-width: 100%; + margin: 0; border-collapse: collapse; + table-layout: auto; } .prose thead { @@ -239,6 +331,15 @@ .prose :where(th, td) { padding: 0.55em 0.8em; border: 1px solid var(--color-border); + overflow-wrap: anywhere; + word-break: break-word; + white-space: normal; +} + +@media (max-width: 48rem) { + .prose .responsive-table { + width: max(100%, calc(var(--table-columns, 1) * 8rem)); + } } .prose :where(th, td)[align='left'] { text-align: left; } diff --git a/src/styles/shortcodes.css b/src/styles/shortcodes.css index 4b84235..896edf4 100644 --- a/src/styles/shortcodes.css +++ b/src/styles/shortcodes.css @@ -6,7 +6,7 @@ border-radius: var(--radius-sm); background: var(--color-accent); color: var(--color-bg); - font-family: var(--mirages-font-ui); + font-family: var(--reading-font-family); font-size: 0.9em; } .prose .shortcode-button:hover { @@ -14,9 +14,54 @@ color: var(--color-bg); } .prose .shortcode-file { + display: inline-flex; + max-width: 100%; + min-height: 3.5rem; + align-items: center; + gap: 1rem; + margin: 0.25rem 0 0.25rem 0.5rem; + overflow: hidden; + padding: 0 1.5rem; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); background: transparent; + color: var(--color-text); + font-family: var(--reading-font-family); + text-decoration: none; + white-space: nowrap; + transition: border-color 0.6s ease; +} +.prose .shortcode-file:first-child { + margin-left: 0; +} +.prose .content-file-icon { + width: 1.5rem; + height: 1.5rem; + flex: 0 0 1.5rem; + color: var(--color-text); + transition: color 0.3s ease; +} +.prose .content-file-filename { + min-width: 0; + overflow: hidden; + color: var(--color-text); + font-weight: 700; + text-overflow: ellipsis; + transition: color 0.3s ease; +} +.prose .shortcode-file:hover { + border-color: var(--color-accent); color: var(--color-accent); } +.prose .shortcode-file:hover .content-file-icon, +.prose .shortcode-file:hover .content-file-filename { + color: var(--color-accent); +} +@media (prefers-reduced-motion: reduce) { + .prose .shortcode-file, + .prose .content-file-icon, + .prose .content-file-filename { transition: none; } +} .shortcode-tag { display: inline-block; margin: 0.15em 0.3em 0.15em 0; @@ -24,7 +69,7 @@ border-radius: 999px; background: var(--color-accent); color: var(--color-bg); - font: 0.82em var(--mirages-font-ui); + font: 0.82em var(--reading-font-family); } .shortcode-tag-outline { background: transparent; @@ -44,29 +89,60 @@ background: #35769b; } .shortcode-hint { + --hint-color: var(--color-accent); + position: relative; margin: 1.2em 0; - padding: 0.7em 1em; - border-left: 4px solid var(--color-accent); - background: var(--color-surface); + padding: 1.5rem 1.25rem 1.5rem 3.5rem; + border: 1px solid color-mix(in srgb, var(--hint-color) 28%, var(--color-border)); + border-left: 0.25rem solid var(--hint-color); + border-radius: var(--radius-sm); + background: color-mix(in srgb, var(--hint-color) 7%, var(--color-surface)); } -.shortcode-hint strong { +.content-hint-icon { + position: absolute; + top: 50%; + left: 1rem; + width: 1.5rem; + height: 1.5rem; + transform: translateY(-50%); + color: var(--hint-color); +} +.content-hint-heading { + display: grid; + min-height: 1.5rem; + grid-template-columns: 1.5rem minmax(0, 1fr); + align-items: center; + gap: 1rem; + margin: 0 0 0.5rem -2.5rem; +} +.content-hint-heading .content-hint-icon { + position: static; + transform: none; +} +.prose .content-hint-title { display: block; - margin-bottom: 0.2em; - font-family: var(--mirages-font-ui); + margin: 0; + color: var(--hint-color); + font-size: 1.2em; + line-height: 1.5rem; + font-weight: 600; } -.shortcode-hint p { +.shortcode-hint p:not(.content-hint-title) { margin: 0.25em 0; } .shortcode-hint-warning, -.shortcode-hint-warn { - border-color: #a36b16; +.shortcode-hint-warn, +.hint-warning { + --hint-color: #d99b00; } .shortcode-hint-error, -.shortcode-hint-danger { - border-color: #ad3d48; +.shortcode-hint-danger, +.hint-danger { + --hint-color: #d34b50; } -.shortcode-hint-success { - border-color: #287d5b; +.shortcode-hint-success, +.hint-success { + --hint-color: #209b61; } .shortcode-collapse { margin: 1.2em 0; @@ -132,10 +208,6 @@ @media (prefers-reduced-motion: reduce) { .shortcode-body { transition: none; } } -.shortcode-body-inner table { - width: 100%; - border-collapse: collapse; -} .shortcode-body .shortcode-collapse { margin: 1rem 0 0.25rem; } @@ -156,6 +228,7 @@ } .shortcode-tabs { margin: 1.2em 0; + overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); @@ -170,15 +243,19 @@ } .shortcode-tab-list button { cursor: pointer; - padding: 0.4rem 0.7rem; + padding: 0.4rem 0.75rem; border: 0; + border-radius: var(--radius-xs); background: transparent; color: var(--color-muted); + font-family: var(--reading-font-family); + transition: background-color 150ms ease, color 150ms ease; } .shortcode-tab-list button[aria-selected="true"] { - background: var(--color-bg); + background: color-mix(in srgb, var(--color-accent) 12%, var(--color-surface)); color: var(--color-accent); font-weight: 600; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .shortcode-tabs [role="tabpanel"] { padding: 0.8rem 1rem; @@ -266,7 +343,7 @@ line-height: 1.25; } .shortcode-tool-description { - color: var(--color-muted); + color: color-mix(in srgb, var(--color-text) 82%, var(--color-muted)); font-size: 0.78rem; line-height: 1.3; } @@ -308,7 +385,7 @@ min-width: 0; margin: 0; overflow-wrap: anywhere; - font: 600 1.08rem/1.35 var(--mirages-font-ui); + font: 600 1.08rem/1.35 var(--reading-font-family); } .shortcode-github-icon { display: inline-block; @@ -336,7 +413,7 @@ justify-content: flex-end; gap: 0.8rem; color: var(--color-muted); - font: 0.75rem var(--mirages-font-ui); + font: 0.75rem var(--reading-font-family); text-align: right; } .shortcode-github-stat { @@ -365,7 +442,7 @@ border: 1px solid var(--color-border); border-radius: var(--radius-sm); color: var(--color-accent); - font: 0.78rem var(--mirages-font-ui); + font: 0.78rem var(--reading-font-family); text-decoration: none; } .shortcode-github-read-more:hover, @@ -383,7 +460,7 @@ padding: 0.6rem 1rem; border-top: 1px solid var(--color-border); color: var(--color-muted); - font: 0.75rem var(--mirages-font-ui); + font: 0.75rem var(--reading-font-family); } .shortcode-github-commit { min-width: 0; @@ -420,9 +497,17 @@ font-style: italic; } .shortcode-notice { - display: inline-block; - padding: 0.1em 0.45em; - border-left: 2px solid var(--color-accent); - background: color-mix(in srgb, var(--color-accent) 8%, transparent); - color: var(--color-accent); + display: inline-flex; + width: 1em; + height: 1em; + align-items: center; + justify-content: center; + color: inherit; + line-height: 1; + vertical-align: -0.125em; +} +.shortcode-notice svg { + display: block; + width: 1em; + height: 1em; }