Skip to content

Commit

Permalink
feat(main): convert HTML to markdown
Browse files Browse the repository at this point in the history
  • Loading branch information
voxpelli committed Jul 21, 2015
1 parent 5a61eb2 commit 721b352
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 7 deletions.
41 changes: 36 additions & 5 deletions index.js
Expand Up @@ -7,6 +7,7 @@ var urlModule = require('url');
var yaml = require('js-yaml');
var strftime = require('strftime');
var ent = require('ent');
var Upndown = require('upndown');

var htmlRegexp = /<[^>]+>/g;
var camelRegexp = /([a-z])([A-Z])/g;
Expand All @@ -17,8 +18,15 @@ var semiKebabCase = function (name) {
return _.deburr(name).replace(camelRegexp, '$1 $2').trim().toLowerCase().replace(kebabRegexp, '-');
};

var Formatter = function (relativeTo) {
this.relativeTo = relativeTo;
var Formatter = function (options) {
if (typeof options === 'string') {
options = { relativeTo: options };
} else {
options = _.extend({}, options || {});
}

this.relativeTo = options.relativeTo;
this.markdown = !options.noMarkdown;
};

Formatter.prototype._formatFrontMatter = function (data) {
Expand Down Expand Up @@ -57,7 +65,19 @@ Formatter.prototype._formatFrontMatter = function (data) {
};

Formatter.prototype._formatContent = function (data) {
return data.properties.content ? data.properties.content + '\n' : '';
if (!data.properties.content) {
return Promise.resolve('');
} else if (!this.markdown) {
return Promise.resolve(data.properties.content.join('\n') + '\n');
}

var und = new Upndown();

return new Promise(function (resolve) {
und.convert(data.properties.content.join('\n'), function (err, markdown) {
resolve((err ? data.properties.content : markdown) + '\n');
});
});
};

Formatter.prototype._formatSlug = function (data) {
Expand Down Expand Up @@ -166,12 +186,23 @@ Formatter.prototype.preFormat = function (data) {
};

Formatter.prototype.format = function (data) {
return Promise.resolve(this._formatFrontMatter(data) + this._formatContent(data));
return Promise.all([
this._formatFrontMatter(data),
this._formatContent(data),
]).then(function (result) {
return result.join('');
});
};

Formatter.prototype.formatFilename = function (data) {
var slug = data.properties.slug[0];
return Promise.resolve('_posts/' + strftime('%Y-%m-%d', data.properties.published[0]) + (slug ? '-' + slug : '') + '.html');

return Promise.resolve(
'_posts/' +
strftime('%Y-%m-%d', data.properties.published[0]) +
(slug ? '-' + slug : '') +
(this.markdown ? '.md' : '.html')
);
};

Formatter.prototype.formatURL = function (data) {
Expand Down
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -31,6 +31,7 @@
"ent": "^2.2.0",
"js-yaml": "^3.3.1",
"lodash": "^3.10.0",
"strftime": "^0.9.2"
"strftime": "^0.9.2",
"upndown": "^2.0.2"
}
}
42 changes: 41 additions & 1 deletion test/formatter.spec.js
Expand Up @@ -141,6 +141,41 @@ describe('Formatter', function () {
);
});

it('should convert HTML to Markdown', function () {
baseMicroformatData.properties.content = ['<p>Abc</p><p>123</p><ul><li>Foo</li><li>Bar</li></ul>'];
return formatter.format(baseMicroformatData).should.eventually.equal(
'---\n' +
'layout: micropubpost\n' +
'date: \'2015-06-30T14:34:01.000Z\'\n' +
'title: awesomeness is awesome\n' +
'slug: awesomeness-is-awesome\n' +
'---\n' +
'Abc\n' +
'\n' +
'123\n' +
'\n' +
'* Foo\n' +
'* Bar\n'
);
});

it('should not convert HTML to Markdown if opted out', function () {
baseMicroformatData.properties.content = ['<p>Abc</p><p>123</p><ul><li>Foo</li><li>Bar</li></ul>'];

formatter = new Formatter({ noMarkdown: true });

return formatter.format(baseMicroformatData).should.eventually.equal(
'---\n' +
'layout: micropubpost\n' +
'date: \'2015-06-30T14:34:01.000Z\'\n' +
'title: awesomeness is awesome\n' +
'slug: awesomeness-is-awesome\n' +
'---\n' +
'<p>Abc</p><p>123</p><ul><li>Foo</li><li>Bar</li></ul>\n'
);
});


});

describe('_formatSlug', function () {
Expand Down Expand Up @@ -196,6 +231,11 @@ describe('Formatter', function () {
describe('formatFilename', function () {

it('should use slug', function () {
return formatter.formatFilename(baseMicroformatData).should.eventually.equal('_posts/2015-06-30-awesomeness-is-awesome.md');
});

it('should have a HTML file type if opted out of Markdown', function () {
formatter = new Formatter({ noMarkdown: true });
return formatter.formatFilename(baseMicroformatData).should.eventually.equal('_posts/2015-06-30-awesomeness-is-awesome.html');
});

Expand Down Expand Up @@ -375,7 +415,7 @@ describe('Formatter', function () {
.should.eventually
.have.all.keys('filename', 'url', 'content', 'files')
.that.deep.equals({
filename: '_posts/2015-06-30-awesomeness-is-awesome.html',
filename: '_posts/2015-06-30-awesomeness-is-awesome.md',
url: 'http://example.com/bar/2015/06/awesomeness-is-awesome/',
content: '---\n' +
'layout: micropubpost\n' +
Expand Down

0 comments on commit 721b352

Please sign in to comment.