导出博客园的内容并生成markdown文件发布到github pages

 博客园支持备份功能:

操作时间是:

工作日18:00之后、8点之前或周六、周日进行备份。

点击备份,可以选择时间段,导出以后,是xml格式,样例格式如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title>博客园-徐同保</title>
<link>https://www.cnblogs.com/xutongbao/</link>
<description>web前端行业的小学生</description><language>zh-cn</language>
<lastBuildDate>Mon, 13 Sep 2021 10:50:44 GMT</lastBuildDate>
<pubDate>Mon, 13 Sep 2021 10:50:44 GMT</pubDate><ttl>60</ttl>

<item><title>pagic Deno + React 驱动的静态网站生成器 入门</title>
  <link>http://www.cnblogs.com/xutongbao/archive/2021/09/10/15264299.html</link>
  <dc:creator>徐同保</dc:creator><author>徐同保</author>
  <pubDate>Fri, 10 Sep 2021 03:03:00 GMT</pubDate>
  <guid>http://www.cnblogs.com/xutongbao/archive/2021/09/10/15264299.html</guid>
  <description>
  <![CDATA[
                      <p>安装:</p> 
  <pre><code class="language-bash"># 安装 pagic
  deno install --unstable --allow-read --allow-write --allow-net --allow-run --name=pagic https://deno.land/x/pagic/mod.ts</code></pre> 
  <p><img alt="" height="664" src="https://img-blog.csdnimg.cn/20210910105934798.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_20,color_FFFFFF,t_70,g_se,x_16" width="677"></p> 
  <p><img alt="" height="113" src="https://img-blog.csdnimg.cn/20210910110003759.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_13,color_FFFFFF,t_70,g_se,x_16" width="344"></p> 
  <p>pagic.config.ts:</p> 
  <pre><code class="language-javascript">export default {}</code></pre> 
  <p>README.md:</p> 
  <pre><code class="language-bash"># Hello world
  </code></pre> 
  <p>启动:</p> 
  <pre><code class="language-bash"># 运行 pagic
  pagic build --watch --serve</code></pre> 
  <p>效果:</p> 
  <p><img alt="" height="447" src="https://img-blog.csdnimg.cn/20210910110203443.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_20,color_FFFFFF,t_70,g_se,x_16" width="1200"></p> 
  <p></p> 
  <p></p> 
  <p></p> 
  <p></p>
  ]]>
  </description>
</item>


<item>
<title>antd Form.Item label添加解释信息</title>
<link>http://www.cnblogs.com/xutongbao/archive/2021/09/10/15264300.html</link>
<dc:creator>徐同保</dc:creator>
<author>徐同保</author>
<pubDate>Fri, 10 Sep 2021 02:29:00 GMT</pubDate>
<guid>http://www.cnblogs.com/xutongbao/archive/2021/09/10/15264300.html</guid>
<description>
<![CDATA[
                    <p><img alt="" height="164" src="https://img-blog.csdnimg.cn/20210910102855685.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_17,color_FFFFFF,t_70,g_se,x_16" width="435"></p> 
<p></p> 
<pre><code class="language-javascript">      &lt;Col span={span} className={expandClassname}&gt;
        &lt;Form.Item
          label={
            &lt;span&gt;
              &lt;span&gt;是否添加&lt;/span&gt;
              &lt;Tooltip
                title='添加'
                overlayClassName="m-tooltip"
              &gt;
                &lt;span className="m-help-wrap"&gt;
                  &lt;Icon name="help"&gt;&lt;/Icon&gt;
                &lt;/span&gt;
              &lt;/Tooltip&gt;
            &lt;/span&gt;
          }
        &gt;
          &lt;Form.Item name="isAdd" noStyle&gt;
            &lt;Select
              placeholder="请选择"
              allowClear
              getPopupContainer={() =&gt;
                document.getElementById('m-content-wrap')
              }
            &gt;
              &lt;Option value={1}&gt;是&lt;/Option&gt;
              &lt;Option value={0}&gt;否&lt;/Option&gt;
            &lt;/Select&gt;
          &lt;/Form.Item&gt;
        &lt;/Form.Item&gt;
      &lt;/Col&gt;</code></pre> 
<p></p>
                ]]></description>
                </item>
                </channel>
</rss>

 xml转md:

 csdn.js:

const fs = require('fs')
const html2md = require('html-to-md')
const { NodeHtmlMarkdown } = require('node-html-markdown')
const mommet = require('moment')
//搜索
const dataSearch = (req, res) => {
  const { dataType = 0 } = req.body

  let dataUrl = {
    0: '/data.xml',
    1: '/dataMiddle.xml',
    2: '/data_9142.xml',
  }[dataType]
  const htmlStr = fs.readFileSync(__dirname + dataUrl, 'utf8')

  //提取所有item标签存入数组中
  let itemArr = []
  htmlStr.replace(/<item(([\s\S])*?)<\/item>/g, (word) => {
    itemArr.push(word)
    return word
  })

  //md文件输出路径
  const outputDir = `D:/source/blog/src/md`
  removeFileDir(outputDir)

  let mdFileNameArr = []
  itemArr.forEach((item, index) => {
    //提取标题
    let title = ''
    item.replace(/<title(([\s\S])*?)<\/title>/g, (word) => {
      title = word.slice(7, word.length - 8)
      return word
    })

    //提取标题
    let pubDate = ''
    item.replace(/<pubDate(([\s\S])*?)<\/pubDate>/g, (word) => {
      pubDate = word.slice(9, word.length - 10)
      return word
    })
    
    const pageDate = mommet(pubDate).format('YYYY-MM-DD HH:mm:ss')
    const mdFileName = mommet(pubDate).format('YYYY-MM-DD_HH_mm_ss')
    
    //提取博客内容
    let content = ''
    item.replace(/<!\[CDATA\[(([\s\S])*?)]]>/g, (word) => {
      content = word.slice(9, word.length - 3)
      return word
    })
    //把标题和内容组织在一起,形成md文件
    const mdFile = `---
title: '${title}'
date: ${pageDate}
---   
${html2md(content)}`

    //创建md文件
    mdFileNameArr.push(mdFileName)
    fs.writeFile(`${outputDir}/${mdFileName}.md`, mdFile, function (err) {
      if (err) {
        return console.log('错误', err)
      }
    })
  })

  res.send({
    state: 1,
    data: {
      count: itemArr.length,
      mdFileNameArr,
    },
    message: 'md文件创建成功',
  })
}

//删除文件夹下的所有文件和子文件夹,不删除该文件夹
const removeFileDir = (path) => {
  let files = fs.readdirSync(path)
  for (let item of files) {
    let stats = fs.statSync(`${path}/${item}`)
    if (stats.isDirectory()) {
      removeFileDir(`${path}/${item}`)
    } else {
      fs.unlinkSync(`${path}/${item}`)
    }
  }
  //fs.rmdirSync(path)
}

module.exports = {
  csdnSearch: dataSearch,
}

 通过postman调接口,执行xml转markdown:

生成的md文件:

0.md:

---
title: 'pagic Deno + React 驱动的静态网站生成器 入门'
---   
安装:

```
# 安装 pagic
  deno install --unstable --allow-read --allow-write --allow-net --allow-run --name=pagic https://deno.land/x/pagic/mod.ts
```

![](https://img-blog.csdnimg.cn/20210910105934798.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_20,color_FFFFFF,t_70,g_se,x_16)

![](https://img-blog.csdnimg.cn/20210910110003759.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_13,color_FFFFFF,t_70,g_se,x_16)

pagic.config.ts:

```javascript
export default {}
```

README.md:

```
# Hello world
  
```

启动:

```
# 运行 pagic
  pagic build --watch --serve
```

效果:

![](https://img-blog.csdnimg.cn/20210910110203443.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_20,color_FFFFFF,t_70,g_se,x_16)

1.md:

---
title: 'antd Form.Item label添加解释信息'
---   
![](https://img-blog.csdnimg.cn/20210910102855685.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5L-d,size_17,color_FFFFFF,t_70,g_se,x_16)

```javascript
      <Col span={span} className={expandClassname}>
        <Form.Item
          label={
            <span>
              <span>是否添加</span>
              <Tooltip
                title='添加'
                overlayClassName="m-tooltip"
              >
                <span className="m-help-wrap">
                  <Icon name="help"></Icon>
                </span>
              </Tooltip>
            </span>
          }
        >
          <Form.Item name="isAdd" noStyle>
            <Select
              placeholder="请选择"
              allowClear
              getPopupContainer={() =>
                document.getElementById('m-content-wrap')
              }
            >
              <Option value={1}>是</Option>
              <Option value={0}>否</Option>
            </Select>
          </Form.Item>
        </Form.Item>
      </Col>
```

使用vuepress-theme-reco把md转换成博客:

https://github.com/vuepress-reco/vuepress-theme-reco

 使用github pages发布博客:

 

 

博客:徐同保的博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
本程序用java编写,运行的时候需要JDK1.5或以上环境,无需安装。程序通过分析博客园博 客源码来生成一些必要的数据,可能在以后使用当中出现爬取不了的情况,可能是博客园的源码 结构修改了。程序只是用于学习之用,严禁用于非法目的而照成博客园服务器过载。 由于生成PDF的时候需要依赖字库,所以在打包程序的时候把一些必要的字库已经放到程序中 去了。可能在生成一些PDF文件的时候出现乱码问题,那是因为里面缺少需要的字库,如遇到这 个问题,请和本人联系:wyphao.2007@163com fonts文件夹是生成pdf文件依赖的字体库,如果生成的pdf文件是乱码,说明缺少相关的字体。 #################################################### 程序功能: 1、支持输入博客园博客用户名针对性下载 2、支持选择保存下载的文件 保存的结构目录为: 选择的保存路径\博客园用户名\pdf 生成的PDF文件保存路径 选择的保存路径\博客园用户名\doc 生成的DOC文件保存路径 选择的保存路径\博客园用户名\txt 生成的TXT文件保存路径 3、支持获取用户博客信息 4、支持显示用户所有的帖子列表 5、可以自己选择需要下载的帖子,有全选、反选、重置按钮 6、支持下载的文件保存为 pdf、doc、txt三种格式 7、生成的pdf、doc文件支持图片 8、支持进度显示 #################################################### 制作时间:2012年07月21日 - 2012年07月21日 制 作:w397090770 个人博客:http://blog.csdn.net/w397090770 Email :wyphao.2007@163.com 版权所有,翻版不究 ####################################################

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同保

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值