热烈庆祝我在连续报错3小时之后终于成功把Lofter上的文章全部导成了markdown……深切体会到更新工具之后不同步更新readme实在是一件很缺德的事情,所以我决定把之前的hexo相册给取消配布了【?
以下是报错经历还原【
.+†+.
首先把导出的lofter数据改名为"LOFTER.xml"(其实改成其它短的标题也行,反正都是要手打的),再用git clone
把脚本下载到本地,找到readxml.js
复制到和你导出的lofter数据同一目录下。打开git bash执行node readxml
,你将会喜迎第一个报错↓
Cannot find module 'xxx'
看到这个报错之后,打开你clone下来的readxml.js
,最开始应该写着如下几行:
1 | var fs = require('fs'), |
放着第一个fs
不用管,后面的xml2js
,to-markdown
,image-downloader
和commander
都是运行LOFTER2hexo的必须程序。
那么如何确定自己有没有安装上述程序呢?
打开你的git bash输入npm root -g
,会显示你npm的默认全局安装路径,选中复制(ctrl+insert)到文件管理器里,检查一下有没有对应名称的文件夹,没有就装,缺啥补啥,除了第一个fs
。
使用如下命令安装需要的程序:
npm i xml2js -g
npm i to-markdown -g
npm i image-downloader -g
npm i commander -g
-g
后缀代表安装在全局路径下,无论你从哪里打开git bash都会安装到刚才显示的目录里。
然后挨个把对应的文件路径复制进readxml.js
里替换原本的路径即可,例:
1 | var fs = require('fs'), |
是的被你发现了我是一个忠实的win7用户:D
然后按照readme里写的,在git bash里输入node readxml ./LOFTER.xml -n
,恭喜你,有50%的概率可以成功导出了,而剩下50%的概率你会遇到下面这个问题↓
导出的md文件是空白的
Error: ENOENT: no such file or directory
↑这就是作者在readme里开心地表示“已解决”的导出空白文件bug的真实原因。
哪里解决了!我这个JS萌新足足折腾了两个小时啊!(╯‵□′)╯︵┻━┻
报这条错的原因是你的lofter文章标题里可能有斜杠 \
/
或者星号 *
或者其它什么别的会触到JS的G点的特殊符号。
至于为什么会导出一堆空白的md文件呢?因为LOFTER2hexo脚本的机制是先把全部的文件创建完毕再往里面写东西,在创建文件的时候遇到特殊符号卡住了,就会剩下一堆已创建的空白文件,看起来像是导出了空白文件,其实它只是没写完而已……😅
我一开始是打算用正则过滤掉特殊符号的,然而试了大概7 8种写法,无论如何都过滤不掉斜杠,每次一到斜杠就直接变成undefined。就在我近乎自闭的时候,突然发现有个报错提示的标题里少了一个斜杠,我这才发现原来作者已经写了一个过滤斜杠的事件了……
就是下面这个:
1 | if (fileName.indexOf('/') != null) { |
然而众所周知让JS干点什么事就好像让男朋友洗碗一样,你叫他洗碗他就绝对只会洗个碗,不会洗盘子,不会洗筷子,也不会刷锅【。这个事件只能过滤掉每个标题的第一个斜杠,如果你后面还有其它斜杠,对不起,还是继续报错。
解决方法是在逗号前面加一个g,变成fileName.replace(/\//g, ' ');
,这样就是全局替换了,会把标题中的所有斜杠都替换成半角空格。
同理星号也是这么处理,但是因为我标题里出现的星号是一堆颜文字,所以我把它转成了unicode编码(其实直接去掉也没关系,因为这里的过滤并不影响md文件里的正文标题):
1 | if (fileName.indexOf('/') != null) { |
我这么改完就可以正常跑起来了,如果还是报错的话就是有其它会导致识别错误的符号,也是按上面那样加就行了。建议另外写一个短的xml来测试符号过滤,因为这么几百个小文件频繁读写其实略伤硬盘_(:з」∠)_