最近在搭建个人博客自动化时,我发现 Hexo 在生成时总会修改 markdown 文件的 front-matter 部分,修改内容集中在日期和标题相关的字段,并且会自动为其添加引号。这引起了我的好奇,于是我决定探究一下

省流

  1. 标题自动添加引号是为了避免纯数字标题类型错误
  2. 日期自动添加引号是因为我的日期格式不正确修改为标准 utc 时间格式后不会自动添加引号(用官方 cli 创建了一个 md 文件后马上就发现了这一点……)

过程

下面放源码

for (const [key, item] of Object.entries(data)) {
if (moment.isMoment(item)) {
data[key] = item.utc().format('YYYY-MM-DD HH:mm:ss');
} else if (moment.isDate(item)) {
data[key] = moment.utc(item).format('YYYY-MM-DD HH:mm:ss');
} else if (typeof item === 'string') {
if (jsonMode || item.includes(':') || item.startsWith('#') || item.startsWith('!!')
|| item.includes('{') || item.includes('}') || item.includes('[') || item.includes(']')
|| item.includes('\'') || item.includes('"')) data[key] = `"${item.replace(/"/g, '\\"')}"`;
}

data 会做预处理,如果传入时已经有 data.date,则会利用 moment() 来初始化该对象

data.date = data.date ? moment(data.date) : moment()

之前自动添加引号的格式为 YYYY\MM\DD HH:mm,测试之后发现,这里居然没有问题,对这个初始化对象调用 moment.utc (item).format() 是可以成功返回的。