中文的阅读习惯是正文段落首行要缩进 2 个汉字,虽说此举可能有历史原因的不得已,但至少就我而言,还是喜欢缩进这种赏心悦目。

只是 Hexo 采用不支持中文缩进的 Markdown 语言,而本网站又是中英双语内容(不希望 English 内容也变成首行缩进),对于不懂 CSS 的 Ai-China 来说,还真是颇费了一番功夫。

好,直接讲实现思路:

  1. 修改 post 模板,直接为中文文章添加 lang: zh-CN 标签。与直接每篇文章都添加一个 lang: zh-CN 等效,只是修改模板更方便。

    或者,如果已有比较多写好的 .md 文件(文章),每个打开再添加很麻烦。这时就要用 js 脚本批量在其 Front-matter 中插入 lang: zh-CN。方法是通过 .md 文件的 Front-matter 中的 title 判断文章是否中文,如果是,则添加 lang: zh-CN。

  2. 添加自定义 css 文件,通过对特定标记的渲染实现只缩进中文正文段落首行的目的。

第一步:

post 模板位于网站根目录下的 scaffolds 文件夹下的 post.md,用 Typora 之类编辑器打开,编辑 Front-matter 添加 lang: zh-CN

image-20231125125825289

以后新建文章的时候,就可以选 zh-CN 和 en 留一个。

或者,

如果已有很写好的 .md 文章,上述的新建模板不会影响到之前的文章。所以写了一个批处理,批量实现上述目的。

同样在博客根目录下打开 cmd,执行如下操作:

如果你希望批量为现有文章的 Front Matter 中插入 lang 标签,可以使用脚本来实现。以下是一个简单的 Node.js 脚本示例,它假设你的文章都是 Markdown 格式的,并且 Front Matter 使用 YAML 格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const fs = require('fs');
const path = require('path');
const matter = require('gray-matter');

const postsDir = path.join(__dirname, 'source/_posts');

fs.readdirSync(postsDir).forEach((file) => {
const filePath = path.join(postsDir, file);

// Check if it's a Markdown file
if (path.extname(file).toLowerCase() === '.md') {
const content = fs.readFileSync(filePath, 'utf-8');
const frontMatter = matter(content);

// Check if 'lang' is already present
if (!frontMatter.data.lang) {
// Determine lang based on title
const isChinese = /[\u4e00-\u9fa5]/.test(frontMatter.data.title);
frontMatter.data.lang = isChinese ? 'zh-CN' : 'en';

// Save the updated content back to the file
const updatedContent = matter.stringify(frontMatter);
fs.writeFileSync(filePath, updatedContent);
console.log(`Updated lang in ${file}`);
}
}
});

请注意,这个脚本使用了 gray-matter 模块来解析和更新 Markdown 文件的 Front Matter 部分。在运行脚本之前,请确保已安装该模块:

1
npm install gray-matter

然后,你可以将上述脚本保存为 add-lang-tags.js 或其他任何名称,然后通过以下命令运行:

1
node add-lang-tags.js

这将扫描你的 Hexo 博客中的所有 Markdown 文章,并在缺少 lang 标签的情况下为其添加 lang 标签。

ps: 处理后似乎在 cover: 后面添加了 >-,但不影响 cover 加载,所以忽略了。


第二步:

进入主题目录下layout文件夹,打开post.pug,找到article#article-container.post-content!=page.content,改为article#article-container.post-content(data-lang=page.lang)!=page.content

创建符合目的的自定义 css。

1
2
3
4
5
6
7
8
9
/* 对于 lang 为 zh-CN 的文章,添加首行缩进两个汉字的样式 */
article#article-container[data-lang="zh-CN"] p {
text-indent: 2em; /* 2个汉字的宽度 */
}

/* 排除引用块中的段落 */
article#article-container[data-lang="zh-CN"] blockquote p {
text-indent: 0;
}

将上述代码保存为custom.css,存储于主题目录下source–>css文件夹内。然后打开主题_config.yml文件,查找如下inject内容,如图修改相对路径后保存:

image-20231125131933545

收尾工作:

重新来一遍:

hexo clean

hexo g

hexo d

hexo s

效果可以查看本站文章,英文保持不变,中文文章已变成段落首行缩进,且引用块不缩进。