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

 

posted @ 2022-08-04 17:04  xkfx  阅读(39)  评论(0编辑  收藏  举报