迁移 Wordpress 的 SQL 文件为 md 文件
山木,自寇也;膏火,自煎也。 桂可食,故伐之;漆可用,故割之。 人皆知有用之用,而莫知无用之用也。
翻到以前 Wordpress 备份的 sql 文件,虽然没有多少有用的东西,但还是想着迁移到现在的博客里边。
.sql => .md
首先知道 sql 语句,INSERT INTO `wp_posts` 这一句,是将后面的一些数据,插入到 wp_posts 的表里边。
大致的格式如下
INSERT INTO `wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES
(1, 1, '2018-06-24 17:50:37', '2018-06-24 09:50:37', '欢迎使用WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!', '世界,您好!', '', 'publish', 'open', 'open', '', 'hello-world', '', '', '2018-06-24 17:50:37', '2018-06-24 09:50:37', '', 0, 'https://blog.huching.cn/?p=1', 0, 'post', '', 1),
(2, 1, '2018-06-24 17:50:37', '2018-06-24 09:50:37', '这是示范页面。页面和博客文章不同,它的位置是固定的,通常会在站点导航栏显示。很多用户都创建一个“关于”页面,向访客介绍自己。例如:\n\n<blockquote>欢迎!我白天是个邮递员,晚上就是个有抱负的演员。这是我的博客。我住在天朝的帝都,有条叫做Jack的狗。</blockquote>\n\n……或这个:\n\n<blockquote>XYZ Doohickey公司成立于1971年,自从建立以来,我们一直向社会贡献着优秀doohickies。我们的公司总部位于天朝魔都,有着超过两千名员工,对魔都政府税收有着巨大贡献。</blockquote>\n\n而您,作为一个WordPress用户,我们建议您访问<a href=\"https://blog.huching.cn/wp-admin/\">控制板</a>,删除本页面,然后添加您自己的页面。祝您使用愉快!', '示例页面', '', 'publish', 'closed', 'open', '', 'sample-page', '', '', '2018-06-24 17:50:37', '2018-06-24 09:50:37', '', 0, 'https://blog.huching.cn/?page_id=2', 0, 'page', '', 0),
从 INSERT 到 VALUES 中间这一段 INSERT INTO `wp_posts` ( ... ) VALUES 就是表的 KEY 下面一一对应的是表的值。
最开始想要找个 Node.js 库来将 SQL 语法转换为抽象语法树(AST),没有找到很好用的,大部分只支持简单的语句,像是导出的复杂表不太适用。其次就算转过了一遍,还有大量冗余数据要处理。于是干脆自己手写正则提取。
这里简单记下步骤,首先读取 sql,然后提取 INSERT 开头到 UNLOCK TABLES 或者 -- ------------- 或者 下一个 INSERT 为截止,中间的内容。即为 wp 文章的部分。
然后扁平展开,通过正则分割:
.match(/((?<!')'(?!')[\s\S]*?(?<!')'(?!')(?=,)|\d+(?=,?))/g)
因为 SQL 内容应该是 , 分割,前后各一个 单引号 '' 包裹字符串,数字就没有包裹,但是如果字符串里本身包含 单引号 ',则用 '' 两个单引号进行转义,如果字符串内容本身就包含逗号 ,,就变得很麻烦。
首先使用惰性模式,尽可能少的匹配任意内容 [\s\S]*?
最终调试出来这一段规则:

最终文件在这里:wppost-md.js