-
Notifications
You must be signed in to change notification settings - Fork 0
/
article.js
110 lines (97 loc) · 2.66 KB
/
article.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
var path = require('path'),
authors = require('./blog.json').authors,
ARTICLE_CONFIG = 'article.json',
ARTICLE_CONTENT = 'article.md',
ARTICLES_PATH = path.normalize(__dirname+'/../articles'),
crypto = require('crypto'),
fs = require('fs'),
moment = require('moment'),
marked = require('marked').setOptions({
gfm: true,
pedantic: false,
sanitize: false,
highlight: function(code, lang) {
return require('highlight').Highlight(code);
}
}),
api,
//in memory collection of sorted articles
sortedArticles = [],
//in memory collection of indexed articles
keyedArticles = {},
//in memory collection of tags => array of article slugs using that tag
tags = {};
function constructArticle(folder) {
var articleConfig = path.join(ARTICLES_PATH, folder, ARTICLE_CONFIG),
articleContent = path.join(ARTICLES_PATH, folder, ARTICLE_CONTENT),
pub_date,
article;
if (path.existsSync(articleConfig) && path.existsSync(articleContent)) {
article = require(articleConfig);
if(article.publish) {
article.content = marked(fs.readFileSync(articleContent, 'utf8'));
article.author = authors[article.author];
pub_date = moment(article.date, 'YYYY-MM-DD hh:mm:ss');
article.formatted_date = pub_date.format('dddd MMMM D, YYYY');
article.slug = folder;
article.path = pub_date.format('/YYYY/MM/DD/')+folder+'/';
if (article.author.gravatar && !article.author.gravatar_hash) {
article.author.gravatar_hash = crypto.createHash('md5').update(article.author.gravatar).digest("hex");
}
}else {
article = null;
}
}
return article;
}
function parseDirectory (cb) {
fs.readdir(ARTICLES_PATH, function(err, files) {
if (err) throw new Error(err);
var article;
files.forEach(function(folder) {
article = constructArticle(folder);
if(article) sortedArticles.push(article);
});
sortedArticles.sort(function(a,b) {
a = Date.parse(a.date);
b = Date.parse(b.date);
if (a < b)
return 1;
if (a > b)
return -1;
return 0;
}).forEach(function(article) {
keyedArticles[article.slug] = article;
(article.tags||[]).forEach(function(tag) {
if(!tags[tag]) tags[tag] = [];
tags[tag].push(article.slug);
});
});
cb(sortedArticles);
});
}
module.exports = api = {
load : function (cb) {
parseDirectory(cb);
return api;
},
getAll : function() {
return sortedArticles;
},
getRecent : function (count) {
return sortedArticles.slice(0, count||25);
},
get : function (folder) {
return keyedArticles[folder];
},
getByTag : function(tag) {
var articles = [];
(tags[tag]||[]).forEach(function(slug) {
articles.push(api.get(slug));
});
return articles;
},
tags : function() {
return tags;
}
};