Compare commits
6 commits
30b0738af0
...
ee714021e6
Author | SHA1 | Date | |
---|---|---|---|
ee714021e6 | |||
daa3df13ad | |||
112f76dae1 | |||
15846c0089 | |||
4a463d2794 | |||
c3ac2c962d |
7 changed files with 56 additions and 11 deletions
41
README.md
41
README.md
|
@ -70,11 +70,48 @@ All commands are run from the root of the project, from a terminal:
|
|||
- [x] Better support for printing version
|
||||
- [ ] Add support for more comment engines
|
||||
- [x] Add support for umami statics
|
||||
- [ ] Improve documentation
|
||||
- [x] Improve documentation
|
||||
- [ ] Release v1.0
|
||||
- [ ] ~~Integrate with Fediverse w/ activityPub~~
|
||||
- [ ] ~~Plain text version when visiting the site via `curl`~~ (can't be done with SSG mode)
|
||||
|
||||
## ⚙️ Advanced Usage
|
||||
### i18n
|
||||
I have implemented i18n support for UI text, but not for content translations yet.
|
||||
|
||||
To further implement i18n, you can:
|
||||
1. Create a new folder under `src/content/posts/` with the language code as the name (e.g., `en`, `zh-CN`, etc.).
|
||||
2. Copy your translated markdown files into the new folder.
|
||||
3. Copy the `src/pages/blog/` folder to `src/pages/[langcode]/blog`.
|
||||
4. Update the i18n config in `astro.config.mjs` to include the new language code.
|
||||
5. Rebuild the site.
|
||||
### plain text version when visiting the site via `curl`
|
||||
The text version of the site is generated by `src/pages/blog/[slug].txt.js`, which outputs a plain text version of the blog post.
|
||||
To access it, you can visit `https://your-site.com/blog/your-post-slug.txt`.
|
||||
|
||||
To automatically output the text version when visiting the site via `curl`, you can:
|
||||
1. If you are using caddy, add the following to your `Caddyfile`:
|
||||
```caddyfile
|
||||
@curl {
|
||||
header_regexp User-Agent (?i)curl
|
||||
}
|
||||
@text {
|
||||
path_regexp text /blog/(.*)
|
||||
}
|
||||
handle @curl {
|
||||
rewrite @text /blog/{http.regexp.text.1}.txt
|
||||
}
|
||||
```
|
||||
2. If you are using cloudflare to proxy your site, you can add a page rule to redirect requests with the `curl` user agent to the `.txt` version of the blog post:
|
||||
If incoming requests match (Custom filter expression):
|
||||
```
|
||||
(http.request.full_uri wildcard r"https://yourblog/blog/*" and http.user_agent contains "curl")
|
||||
```
|
||||
Then (Rewrite to,static):
|
||||
```
|
||||
/blog/${1}.txt
|
||||
```
|
||||
3. If you are using other web servers, you can use functions like `rewrite` or `redirect` by user agent (HTTP header) to achieve the same effect.
|
||||
## 👀 Want to learn more?
|
||||
|
||||
See the post [🕊](). I hope you like it. 💜
|
||||
|
@ -88,6 +125,6 @@ Other tools like GitHub Copilot helps too.
|
|||
|
||||
(I know the LLMs sometimes sucks, but it really helps most of the time)
|
||||
|
||||
Also [delucis/astro-blog-full-text-rss](https://github.com/delucis/astro-blog-full-text-rss) for implementing full text RSS in pretty easy way
|
||||
Also, [delucis/astro-blog-full-text-rss](https://github.com/delucis/astro-blog-full-text-rss) for implementing full text RSS in pretty easy way.
|
||||
## ⚖️ License
|
||||
GNU Affero Public License 3.0
|
|
@ -37,6 +37,11 @@ export default defineConfig({
|
|||
rehypePlugins: [rehypeKatex]
|
||||
},
|
||||
|
||||
image: {
|
||||
responsiveStyles: true,
|
||||
layouts: 'constrained',
|
||||
},
|
||||
|
||||
i18n: {
|
||||
locales: ["en", "zh_hans"],
|
||||
defaultLocale: "en",
|
||||
|
|
|
@ -5,7 +5,7 @@ import {siteConfig} from "../../../config";
|
|||
const { data } = Astro.props;
|
||||
|
||||
// Get author data
|
||||
const authorAvatar = data.mcplayerid ? `/images/avatars/${data.mcplayerid}.png` : null;
|
||||
const authorAvatar = data.mcplayerid ? `/images/avatars/${data.mcplayerid}.png` : (data.avatar ? data.avatar : null);
|
||||
const authorName = data.name ? data.name : null;
|
||||
---
|
||||
{(siteConfig.displayAvatar && data) &&
|
||||
|
|
|
@ -11,8 +11,8 @@ import Statistics from "../components/Statistics.astro";
|
|||
import Navbar from "../components/Navbar.astro";
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
description: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
author?: string;
|
||||
path?: string;
|
||||
ogImage?: string;
|
||||
|
|
|
@ -66,7 +66,7 @@ async function cacheAvatar(cacheKey, data) {
|
|||
}
|
||||
|
||||
function addToMemoryCache(key, data) {
|
||||
// If cache is full, remove oldest entry
|
||||
// If cache is full, remove the oldest entry
|
||||
if (AVATAR_CACHE.size >= CACHE_MAX_SIZE) {
|
||||
const oldestKey = AVATAR_CACHE.keys().next().value;
|
||||
AVATAR_CACHE.delete(oldestKey);
|
||||
|
@ -80,8 +80,10 @@ function addToMemoryCache(key, data) {
|
|||
|
||||
export async function getStaticPaths() {
|
||||
const authorsData = await getCollection('authors');
|
||||
return authorsData.map(author => ({
|
||||
params: { author: author.id },
|
||||
return authorsData
|
||||
.filter(author => author.data.mcplayerid) // Only include authors with mcplayerid
|
||||
.map(author => ({
|
||||
params: { author: author.data.mcplayerid },
|
||||
props: { author }
|
||||
}));
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ try {
|
|||
}
|
||||
---
|
||||
|
||||
<Layout title="" description="That a good start.">
|
||||
<Layout>
|
||||
<h1 class="title">~/</h1>
|
||||
<div class="content">
|
||||
{HomePageContent ? <HomePageContent/> :
|
||||
|
|
|
@ -103,6 +103,7 @@ body {
|
|||
|
||||
.nav {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 2rem;
|
||||
margin: 1.5rem 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue