Node解析博客园的备份文件并生成一个简易的静态网站
因为文章越写越多,就时不时会备份一下,但是下载下来那个.xml又不知道怎么弄,看也看不懂,偶然的机会了解到rss这个东西,对比了一下居然真的是,恰好Hexo的博客迁移插件非常不给力,于是打算自己弄一下。
解析博客园的备份文件
究极简单,最关键的工作是把插件给装上(🐶):
cnpm install htmlparser2
代码:
const fs = require("fs").promises
const path = require('path')
function readFile(path) {
let opions = {
encoding: 'utf-8',
}
return fs.readFile(path, opions)
}
// 现在就是要读一个rss格式的文件,然后解析之....
let file_path = path.join(__dirname, 'cnblog_backup_rss_posts.xml')
// 这个文件就在当前目录下.把它输出来看一下是不是先,
console.log(file_path)
const htmlparser2 = require("htmlparser2");
let dealWithContent = (content) => {
// 现在我们拿到这个content,感觉良好,,
// console.log(content)
// 准备整个rss解析的东西来把它对象化一下,然后搞成文件输出
// 大功告成,这是最理想的情况,要不然自己正则表达式解析也不是不行
const feed = htmlparser2.parseFeed(content);
// console.log(feed)
// 看看数量先
console.log(feed.items[0])
}
readFile(file_path).then(content => dealWithContent(content))
输出示例:
{ media: [], id: 'http://www.cnblogs.com/xkxf/archive/2022/07/29/16531503.html', title: 'CSS布局 #02# A Three-Column Fluid Center Layout', link: 'http://www.cnblogs.com/xkxf/archive/2022/07/29/16531503.html', description: "<p>这里就是文章内容(省略两万字)</p>\n", pubDate: 2022-07-29T03:14:00.000Z }
生成一个简易的静态网站
直接上代码:
const fs = require("fs").promises
const path = require('path')
const htmlparser2 = require("htmlparser2")
const { nanoid } = require("nanoid");
// "nanoid": "^3.3.4"
function readFile(path) {
let opions = {
encoding: 'utf-8',
}
return fs.readFile(path, opions)
}
async function totalWork() {
// 原始文件 转 obj
console.log('* 原始文件 转 obj')
let rss_path = path.join(__dirname, 'cnblog_backup_rss_posts.xml')
let rss_raw_content = await readFile(rss_path)
let rss_objs = htmlparser2.parseFeed(rss_raw_content)
let posts = rss_objs.items.map(rss_obj => {
let post = {
id: nanoid(8),
title: rss_obj.title,
content: rss_obj.description,
pubDate: rss_obj.pubDate,
}
return post
})
// obj 转 json 并写入文件
// console.log('* obj 转 json 并写入文件')
// let posts_json = JSON.stringify(posts)
// let json_path = path.join(__dirname, 'posts.json')
// await fs.writeFile(json_path, posts_json)
// 递归删除posts文件夹及文件
console.log('* 递归删除posts文件夹及文件')
await fs.rm('./posts/', { recursive: true, force: true })
// obj 生成静态HTML文章
console.log('* 创建posts文件夹')
await fs.mkdir('./posts/')
let writeFileTasks = posts.map(post => {
return fs.writeFile(`./posts/${post.id}.html`, post.content).catch(err => {
console.log(`* 生成【./posts/${post.id}(${post.title}).html】异常`)
console.log(err)
})
})
console.log('* 等待所有writeFile任务完成')
Promise.all(writeFileTasks)
console.log('* 所有writeFile任务完成')
// 生成简单索引页
let indexHtml = '<html><body><table>'
for (let i = 0; i != posts.length; ++i) {
let result = `<tr>`
+ `<td>${i}</td>`
+ `<td>${posts[i].id}</td>`
+ `<td>${posts[i].title}</td>`
+ `<td>${posts[i].pubDate}</td>`
+ `<td><a href="./posts/${posts[i].id}.html">点我访问</a></td>`
+ `</tr>`
indexHtml += result
}
indexHtml += '</table></body></html>'
console.log('* 生成简单索引页')
await fs.writeFile('index.html', indexHtml)
}
totalWork().then(() => {
console.log('* totalWork完成')
}).catch(err => {
console.log('* 捕捉到err:')
console.log(err)
})
浙公网安备 33010602011771号