猫都能看懂的LOFTER2hexo调教指南

  热烈庆祝我在连续报错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
2
3
4
5
6
var fs = require('fs'),
xml2js = require('xml2js'),
toMarkdown = require('to-markdown'),
parser = new xml2js.Parser(),
image_downloader = require('image-downloader'),
argv = require('commander')

  放着第一个fs不用管,后面的xml2jsto-markdownimage-downloadercommander都是运行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
2
3
4
5
6
var fs = require('fs'),
xml2js = require('C:/Users/shioko/AppData/Roaming/npm/node_modules/xml2js'),
toMarkdown = require('C:/Users/shioko/AppData/Roaming/npm/node_modules/to-markdown'),
parser = new xml2js.Parser(),
image_downloader = require('C:/Users/shioko/AppData/Roaming/npm/node_modules/image-downloader'),
argv = require('C:/Users/shioko/AppData/Roaming/npm/node_modules/commander')

  是的被你发现了我是一个忠实的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
2
3
if (fileName.indexOf('/') != null) {
var fileName = fileName.replace(/\//, ' ');
}

  然而众所周知让JS干点什么事就好像让男朋友洗碗一样,你叫他洗碗他就绝对只会洗个碗,不会洗盘子,不会洗筷子,也不会刷锅【。这个事件只能过滤掉每个标题的第一个斜杠,如果你后面还有其它斜杠,对不起,还是继续报错。
  解决方法是在逗号前面加一个g,变成fileName.replace(/\//g, ' ');,这样就是全局替换了,会把标题中的所有斜杠都替换成半角空格。
  同理星号也是这么处理,但是因为我标题里出现的星号是一堆颜文字,所以我把它转成了unicode编码(其实直接去掉也没关系,因为这里的过滤并不影响md文件里的正文标题):

1
2
3
4
5
6
if (fileName.indexOf('/') != null) {
var fileName = fileName.replace(/\//g, ' ');
}
if (fileName.indexOf('*') != null) {
var fileName = fileName.replace(/\*/g, '*');
}

  我这么改完就可以正常跑起来了,如果还是报错的话就是有其它会导致识别错误的符号,也是按上面那样加就行了。建议另外写一个短的xml来测试符号过滤,因为这么几百个小文件频繁读写其实略伤硬盘_(:з」∠)_