1
0
Files
frost-zx.github.io/scripts/convert-siyuan-notes.mjs

119 lines
2.9 KiB
JavaScript

import { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
/** 转换 Markdown 表格为 JSON */
function markdownTableToJson(markdownTable = '') {
// 移除行首尾的管道符号和空格,然后按管道符号分割
let parseTableRow = (line) => {
return line
.replace(/^\||\|$/g, '') // 移除首尾的管道符号
.replace(/\\/g, '') // 移除转义符号
.replace(/<br\/>/g, '') // 移除换行标签
.split('|')
.map(cell => cell.trim());
};
// 检查分隔行是否包含至少一个冒号或连字符
let isValidTableSeparator = (line) => {
return line.includes('-') && line.includes('|');
};
// 按行分割表格
let lines = markdownTable.trim().split('\n');
// 解析表头
let headerLine = lines[0];
let headers = parseTableRow(headerLine);
// 解析表头分隔行(第二行),用于验证表格格式
let separatorLine = lines[1];
if (!isValidTableSeparator(separatorLine)) {
throw new Error('无效的 Markdown 表格');
}
// 解析数据行
let dataRows = lines.slice(2).map(line => parseTableRow(line));
// 转换为 JSON 对象数组
let jsonArray = dataRows.map(row => {
let obj = {
'title': '',
'slug': '',
'created-at': '',
'updated-at': '',
'is-hide': '',
};
headers.forEach((header, index) => {
let key = header.trim();
let text = row[index];
if (typeof obj[key] !== 'undefined') {
obj[key] = text ? text.trim() : '';
}
});
return obj;
});
return jsonArray;
}
(function () {
console.clear();
let rootDir = join(__dirname, 'siyuan-notes');
let indexFilePath = join(rootDir, 'blog.frost-zx.top.md');
let markdownDir = join(rootDir, 'blog.frost-zx.top');
let jsonPath = join(rootDir, 'content-list.json');
let indexContent0 = readFileSync(indexFilePath, { encoding: 'utf-8' });
let indexContent1 = indexContent0.split('\n').filter((text) => {
// 只保留表格行
return text.startsWith('|');
}).join('\n');
// 转换为 JSON
let indexJson = markdownTableToJson(indexContent1);
// 处理文件
for (let i = indexJson.length - 1; i >= 0; i--) {
let item = indexJson[i];
let oldName = (item['title'] + '.md').replace(/[":<>]/g, '_');
let oldPath = join(markdownDir, oldName);
let newName = item['slug'] + '.md';
let newPath = join(markdownDir, newName);
if (item['is-hide']) {
console.warn(`删除文件:${oldName}`);
rmSync(oldPath);
indexJson.splice(i, 1);
continue;
}
console.warn(`重命名文件:${oldName} -> ${newName}`);
renameSync(oldPath, newPath);
}
// 输出 JSON 文件
writeFileSync(jsonPath, JSON.stringify(indexJson, null, 2), {
encoding: 'utf-8',
flag: 'w',
});
})();