mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
3.9 KiB
189 lines
3.9 KiB
var sax = require('sax');
|
|
var fs = require('fs');
|
|
var parser = sax.parser(false, { lowercase: true });
|
|
var assert = require('assert');
|
|
var mkdirp = require('mkdirp');
|
|
var url = require('url');
|
|
|
|
var input = fs.createReadStream(process.argv[2]);
|
|
input.on('data', function(c) {
|
|
parser.write(c.toString());
|
|
});
|
|
input.on('end', parser.end.bind(parser));
|
|
|
|
var post = null;
|
|
var author = null;
|
|
var authors = {};
|
|
mkdirp.sync('out');
|
|
|
|
parser.onopentag = function (tag) {
|
|
switch (tag.name) {
|
|
case 'wp:author':
|
|
assert(author === null);
|
|
author = {};
|
|
author.text = '';
|
|
return;
|
|
|
|
case 'wp:author_login':
|
|
assert(author);
|
|
author.field = 'login';
|
|
author.text = '';
|
|
return;
|
|
|
|
case 'wp:author_display_name':
|
|
assert(author);
|
|
author.field = 'name';
|
|
author.text = '';
|
|
return
|
|
|
|
case 'wp:author_first_name':
|
|
assert(author);
|
|
author.field = 'first_name';
|
|
author.text = '';
|
|
return;
|
|
|
|
case 'wp:author_last_name':
|
|
assert(author);
|
|
author.field = 'last_name';
|
|
author.text = '';
|
|
return;
|
|
|
|
case 'item':
|
|
assert(post === null);
|
|
post = {};
|
|
post.text = '';
|
|
return;
|
|
|
|
case 'title':
|
|
if (post === null) return;
|
|
post.field = 'title';
|
|
return
|
|
|
|
case 'pubDate':
|
|
case 'wp:post_date':
|
|
post.field = 'date';
|
|
return;
|
|
|
|
case 'dc:creator':
|
|
post.field = 'author';
|
|
return;
|
|
|
|
case 'wp:status':
|
|
post.field = 'status';
|
|
return;
|
|
|
|
case 'category':
|
|
post.field = 'category';
|
|
return;
|
|
|
|
case 'content:encoded':
|
|
post.field = 'body';
|
|
return;
|
|
|
|
case 'link':
|
|
if (post) post.field = 'link';
|
|
return;
|
|
|
|
default:
|
|
if (post) post.field = null;
|
|
if (author) author.field = null;
|
|
return;
|
|
}
|
|
};
|
|
|
|
parser.onclosetag = function (tagName, tag) {
|
|
switch (tagName) {
|
|
case 'wp:author':
|
|
assert(author);
|
|
finishAuthor();
|
|
return;
|
|
case 'item':
|
|
assert(post);
|
|
finishPost();
|
|
return;
|
|
default:
|
|
if (post && post.field || author && author.field) finishField();
|
|
return;
|
|
}
|
|
};
|
|
|
|
parser.ontext = parser.oncdata = function (text) {
|
|
if (author) {
|
|
if (author.field) author.text += text;
|
|
else author.text = '';
|
|
} else if (post) {
|
|
if (post.field) post.text += text;
|
|
else post.field = '';
|
|
}
|
|
};
|
|
|
|
function finishField() {
|
|
if (post && post.field) {
|
|
post[post.field] = post.text;
|
|
post.field = null;
|
|
post.text = '';
|
|
} else if (author && author.field) {
|
|
author[author.field] = author.text;
|
|
author.field = null;
|
|
author.text = '';
|
|
}
|
|
}
|
|
|
|
function finishPost() {
|
|
// don't port drafts.
|
|
if (post.status === 'draft') {
|
|
return post = null;
|
|
}
|
|
post.date = new Date(post.date);
|
|
|
|
if (post.link) {
|
|
post.slug =
|
|
url.parse(post.link)
|
|
.pathname
|
|
.replace(/\/+$/, '')
|
|
.split('/')
|
|
.pop();
|
|
}
|
|
if (!post.slug) {
|
|
post.slug =
|
|
(post.title + '-' + post.date.toISOString())
|
|
.replace(/[^a-z0-9]+/gi, '-')
|
|
.replace(/^-|-$/g, '')
|
|
.toLowerCase();
|
|
}
|
|
post.slug = post.slug || '-';
|
|
|
|
delete post.text
|
|
delete post.link
|
|
delete post.field
|
|
post.author = authors[post.author] || post.author;
|
|
|
|
post.body = post.body || '';
|
|
|
|
// actually write it!
|
|
var output = [];
|
|
Object.keys(post)
|
|
.filter(function (f) { return f !== 'body' }).forEach(function (k) {
|
|
output.push(k + ': ' + post[k]);
|
|
})
|
|
output = output.join('\n') + '\n\n' + post.body.trim() + '\n';
|
|
|
|
var f = 'out/' + post.category + '/' + post.slug + '.md';
|
|
console.log(f, post.title);
|
|
mkdirp.sync('out/' + post.category)
|
|
fs.writeFileSync(f, output, 'utf8');
|
|
|
|
post = null;
|
|
}
|
|
|
|
function finishAuthor () {
|
|
author.name = author.name ||
|
|
(author.first_name + ' ' + author.last_name) ||
|
|
author.login;
|
|
delete author.first_name
|
|
delete author.last_name
|
|
delete author.text
|
|
delete author.field
|
|
authors[author.login] = author.name
|
|
author = null;
|
|
}
|
|
|