Skip to content

Commit

Permalink
Refactor util.yfm
Browse files Browse the repository at this point in the history
  • Loading branch information
tommy351 committed Mar 17, 2014
1 parent f07d120 commit 465aac7
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 47 deletions.
5 changes: 3 additions & 2 deletions lib/plugins/processor/page.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,11 @@ module.exports = function(data, callback){
if (err) return callback(err);

var stat = results.stat,
link = '';
link = '',
meta;

try {
var meta = yfm(results.read);
meta = yfm(results.read);
} catch (e){
return callback(e);
}
Expand Down
5 changes: 3 additions & 2 deletions lib/plugins/processor/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,11 @@ module.exports = function(data, callback){
data.read({cache: true}, next);
},
post: ['stat', 'read', function(next, results){
var stat = results.stat;
var stat = results.stat,
meta;

try {
var meta = yfm(results.read);
meta = yfm(results.read);
} catch (e){
return next(e);
}
Expand Down
50 changes: 34 additions & 16 deletions lib/util/yfm.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* See {% crosslink util.yfm/parse %}.
*
* @method yfm
* @param {String} source
* @param {String} str
* @return {Object}
* @for util
* @static
Expand All @@ -21,31 +21,41 @@ var _ = require('lodash'),
yaml = require('yamljs'),
escape = require('./escape').yaml;

var yfm = module.exports = function(source){
var content = source.replace(/^-{3,}/, '').split(/-{3,}/),
result = {};
var rYFM = /^(-{3,}\n+)?([\s\S]+?)-{3,}\n{0,}([\s\S]*)/;

if (content.length === 1){
result = {_content: content[0]};
} else {
result = yaml.parse(escape(content.shift()));
result._content = content.join('---').replace(/^\n*/, '');
}

return result;
var yfm = module.exports = function(str){
return parse(str);
};

/**
* Parses YAML front-matter.
*
* @method parse
* @param {String} source
* @param {String} str
* @return {Object}
* @static
*/

yfm.parse = function(source){
return yfm(source);
var parse = yfm.parse = function(str){
if (!rYFM.test(str)){
return {_content: str};
}

var match = str.match(rYFM),
raw = match[2],
content = match[3] || '';

try {
var data = yaml.parse(escape(raw));

if (typeof data === 'object'){
return _.extend(data, {_content: content});
} else {
return {_content: str};
}
} catch (e){
return {_content: str};
}
};

/**
Expand All @@ -58,5 +68,13 @@ yfm.parse = function(source){
*/

yfm.stringify = function(obj){
return yaml.stringify(_.omit(obj, '_content')) + '\n---\n' + obj._content;
var data = _.omit(obj, '_content'),
content = obj._content || '',
keys = Object.keys(data);

if (keys.length){
return yaml.stringify(data) + '\n---\n' + content;
} else {
return content;
}
};
2 changes: 1 addition & 1 deletion test/blog/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hexo",
"version": "2.5.1",
"version": "2.5.2",
"private": true,
"dependencies": {}
}
169 changes: 143 additions & 26 deletions test/util/yfm.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,153 @@ var yaml = require('yamljs'),
describe('Util - yfm', function(){
var yfm = require('../../lib/util/yfm');

var str = [
'layout: post',
'title: Today is a beatuiful day',
'date: 2013-08-18 23:46:27',
'comments: true',
'tags:',
'- Foo',
'- Bar',
'categories:',
' foo: 1',
' bar: 2'
].join('\n');

var obj = yaml.parse(str);

it('normal format', function(){
yfm('---\n' + str + '\n---\ncontent').should.eql(_.extend({_content: 'content'}, obj));
});
describe('parse', function(){
it('only content', function(){
var str = [
'foo',
'bar'
].join('\n');

it('simplified format', function(){
yfm(str + '\n---\ncontent').should.eql(_.extend({_content: 'content'}, obj));
});
var data = yfm.parse(str);
data._content.should.eql(str);
});

it('only content (with ---)', function(){
var str = [
'foo',
'---',
'str'
].join('\n');

var data = yfm.parse(str);
data._content.should.eql(str);
});

it('new style', function(){
var str = [
'layout: post',
'---',
'123'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});

it('new style (without content)', function(){
var str = [
'layout: post',
'---'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('');
});

it('new style (trim)', function(){
var str = [
'',
'layout: post',
'',
'---',
'',
'',
'',
'123'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});

it('new style (more than 3 dashes)', function(){
var str = [
'layout: post',
'------',
'123'
].join('\n');

it('empty content', function(){
yfm(str + '\n---').should.eql(_.extend({_content: ''}, obj));
var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});

it('old style', function(){
var str = [
'---',
'layout: post',
'---',
'123'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});

it('old style (without content)', function(){
var str = [
'---',
'layout: post',
'---'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('');
});

it('old style (trim)', function(){
var str = [
'---',
'',
'layout: post',
'',
'---',
'',
'',
'',
'123'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});

it('old style (more than 3 dashes)', function(){
var str = [
'----',
'layout: post',
'------',
'123'
].join('\n');

var data = yfm.parse(str);
data.layout.should.eql('post');
data._content.should.eql('123');
});
});

it('stringify', function(){
var txt = yfm.stringify(_.extend({_content: 'content'}, obj));
describe('stringify', function(){
it('with data', function(){
var data = {
layout: 'post',
_content: '123'
};

yfm.stringify(data).should.eql('layout: post\n\n---\n123');
});

it('without data', function(){
var data = {
_content: '123'
};

yfm(txt).should.eql(_.extend({_content: 'content'}, obj));
yfm.stringify(data).should.eql('123');
});
});
});

0 comments on commit 465aac7

Please sign in to comment.