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) })