1 | var path = require('path'),
|
2 | async = require('async'),
|
3 | cheerio = require('cheerio'),
|
4 | common = require('./common.js');
|
5 |
|
6 | function formatMoney(n) {
|
7 | var c = 0, d = ".", t = ",", s = n < 0 ? "-" : "";
|
8 | var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "";
|
9 | var j = (j = i.length) > 3 ? j % 3 : 0;
|
10 | return "$" + s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
|
11 | };
|
12 |
|
13 | module.exports = function(config) {
|
14 | function move_file(old_file, new_file, files) {
|
15 | files[new_file] = files[old_file];
|
16 | delete(files[old_file]);
|
17 | }
|
18 | return function(files, metalsmith, done) {
|
19 |
|
20 | var metadata = metalsmith.metadata();
|
21 | metadata['build_date'] = metadata['date'];
|
22 |
|
23 | async.series([
|
24 | function (callback) {
|
25 | async.each(metadata.courses, function(course, finished) {
|
26 | course.common = metadata.courses_common[course.common];
|
27 | course.year = common.format_date(course.started, "YYYY");
|
28 | course.name = course.common.title + ' (' + course.semester + ' ' + course.year + ')';
|
29 | finished();
|
30 | },
|
31 | function () {
|
32 | callback();
|
33 | });
|
34 | },
|
35 | function (callback) {
|
36 | async.each(metadata.posts, function(post, finished) {
|
37 | var $ = cheerio.load(post.contents);
|
38 | if (!post.title) {
|
39 | post.title = $("h2").first().text();
|
40 | }
|
41 | finished();
|
42 | },
|
43 | function () {
|
44 | callback();
|
45 | });
|
46 | },
|
47 | function (callback) {
|
48 | var post_slugs = {};
|
49 |
|
50 | async.forEachOf(files, function (file, filename, finished) {
|
51 | if ('person' in file) {
|
52 | file.email = filename.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi)[0];
|
53 | file.username = /([a-zA-Z0-9._-]+)@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+/gi.exec(filename)[1];
|
54 | if (!file.slug) {
|
55 | file.slug = file.username;
|
56 | }
|
57 | } else if ('project' in file) {
|
58 | file.slug = filename.match(/\/(\S+)\/summary.html/)[1];
|
59 | } else if ('paper' in file) {
|
60 | file.slug = filename.match(/\/([\w-]+)\/summary.html/)[1];
|
61 | file.year = filename.match(/^papers\/(\d+)\//)[1];
|
62 | } else if ('proposal' in file) {
|
63 | file.slug = filename.match(/\/([\w-]+)\/summary.html/)[1];
|
64 | file.year = common.format_date(file.started, "YYYY");
|
65 | } else if ('course' in file) {
|
66 | file.slug = file.common.slug + '_' + file.semester + '_' + file.year;
|
67 | } else if ('post' in file) {
|
68 | function slugify(text) {
|
69 | return text.toString().toLowerCase()
|
70 | .replace(/\s+/g, '-')
|
71 | .replace(/[^\w\-]+/g, '')
|
72 | .replace(/\-\-+/g, '-')
|
73 | .replace(/^-+/, '')
|
74 | .replace(/-+$/, '');
|
75 | }
|
76 | post_slug = common.format_date(file.created, 'YYYY-MM-DD', false) + "-" + slugify(file.title.slice(0, 32));
|
77 | if (post_slugs[post_slug] !== undefined) {
|
78 | return done(new Error("duplicate post slug"));
|
79 | }
|
80 | if (file.working) {
|
81 | console.log("Working post: " + post_slug);
|
82 | }
|
83 | post_slugs[post_slug] = true;
|
84 | file.slug = post_slug
|
85 | file.people = [filename.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi)[0]];
|
86 | }
|
87 | finished();
|
88 | }, function () {
|
89 | callback();
|
90 | });
|
91 | },
|
92 | function (callback) {
|
93 | async.each(metadata.people, function(person, finished) {
|
94 | person.person = true;
|
95 | if (person.link) {
|
96 | if ((person.link + '/photo.jpg').slice(1) in files) {
|
97 | person.photo = person.link + '/photo.jpg';
|
98 | }
|
99 | if (!person.CV) {
|
100 | old_file = (person.link + '/CV.pdf').slice(1);
|
101 | if (old_file in files) {
|
102 | new_file = (person.link + '/' + person.name.replace(/\s+/g, '') + '-CV.pdf').slice(1);
|
103 | move_file(old_file, new_file, files);
|
104 | person.CV = "/" + new_file;
|
105 | }
|
106 | }
|
107 | person.finished = person.photo && person.snippet.length;
|
108 | }
|
109 | if (person.finished && !person.alumni) {
|
110 | person.group = true;
|
111 | } else if (person.finished && person.alumni) {
|
112 | if (!person.short_alumni) {
|
113 | person.long_alumni = true;
|
114 | } else {
|
115 | person.short_alumni = true;
|
116 | }
|
117 | } else if (person.old_group) {
|
118 | person.short_alumni = true;
|
119 | } else {
|
120 | person.collaborator = true;
|
121 | }
|
122 | finished();
|
123 | }, function () {
|
124 | callback();
|
125 | });
|
126 | },
|
127 | function (callback) {
|
128 | async.each(metadata.projects, function(project, finished) {
|
129 | if (project.ended) {
|
130 | project.active = false;
|
131 | } else {
|
132 | project.active = true;
|
133 | }
|
134 | if (!project.title) {
|
135 | project.title = project.name;
|
136 | } else if (!project.name) {
|
137 | project.name = project.title;
|
138 | }
|
139 | finished();
|
140 | }, function () {
|
141 | callback();
|
142 | });
|
143 | },
|
144 | function (callback) {
|
145 | async.each(metadata.papers, function(paper, finished) {
|
146 | if (!paper.thesis) {
|
147 | paper.conference = metadata.conferences[paper.published][paper.year];
|
148 | paper.conference.year = paper.year;
|
149 | paper.published = metadata.conferences[paper.published];
|
150 | paper.date = paper.conference.date;
|
151 | paper.toappear = (paper.date > Date.now());
|
152 | }
|
153 |
|
154 | old_file = undefined;
|
155 | if ((paper.link + '/paper.pdf').slice(1) in files) {
|
156 | old_file = (paper.link + '/paper.pdf').slice(1);
|
157 | } else if ((paper.link + '/poster.pdf').slice(1) in files) {
|
158 | old_file = (paper.link + '/poster.pdf').slice(1);
|
159 | } else if ((paper.link + '/thesis.pdf').slice(1) in files) {
|
160 | old_file = (paper.link + '/thesis.pdf').slice(1);
|
161 | }
|
162 | if (old_file) {
|
163 | new_file = (paper.link + '/' + paper.slug + '.pdf').slice(1);
|
164 | move_file(old_file, new_file, files);
|
165 | paper.PDF = "/" + new_file;
|
166 | }
|
167 | old_file = undefined;
|
168 | if ((paper.link + '/slides.pdf').slice(1) in files) {
|
169 | old_file = (paper.link + '/slides.pdf').slice(1);
|
170 | }
|
171 | if (old_file) {
|
172 | new_file = (paper.link + '/' + paper.slug + '-Slides.pdf').slice(1);
|
173 | move_file(old_file, new_file, files);
|
174 | paper.slides = "/" + new_file;
|
175 | }
|
176 | paper.conference_metadata = !(paper.poster || paper.thesis);
|
177 | finished();
|
178 | }, function () {
|
179 | callback();
|
180 | });
|
181 | },
|
182 | function (callback) {
|
183 |
|
184 | async.each(metadata.proposals, function(proposal, finished) {
|
185 | proposal.source = metadata.sources[proposal.source];
|
186 | proposal.program = proposal.source.programs[proposal.program];
|
187 | proposal.pretty_amount = formatMoney(proposal.amount);
|
188 | proposal.year = proposal.started.getFullYear();
|
189 |
|
190 | old_file = undefined;
|
191 | if ((proposal.link + '/external.pdf').slice(1) in files) {
|
192 | old_file = (proposal.link + '/external.pdf').slice(1);
|
193 | }
|
194 | if (old_file) {
|
195 | new_file = (proposal.link + '/' + proposal.slug + '.pdf').slice(1);
|
196 | move_file(old_file, new_file, files);
|
197 | proposal.PDF = "/" + new_file;
|
198 | }
|
199 | if (proposal.ends < Date.now()) {
|
200 | proposal.active = false;
|
201 | } else {
|
202 | proposal.active = true;
|
203 | }
|
204 | proposal.inactive = !(proposal.active);
|
205 | if ('proposals/logos/' + proposal.source.shortname + '.jpg' in files) {
|
206 | proposal.logo = '/proposals/logos/' + proposal.source.shortname + '.jpg';
|
207 | }
|
208 | finished();
|
209 | }, function () {
|
210 | callback();
|
211 | });
|
212 | },
|
213 | function (callback) {
|
214 | async.each(metadata.courses, function(course, finished) {
|
215 | var $ = cheerio.load(course.contents);
|
216 | course.has_evaluations = $().is('#evaluations');
|
217 | course.has_summary = $().is('#summary');
|
218 | old_file = undefined;
|
219 | if ((course.link + '/syllabus.pdf').slice(1) in files) {
|
220 | old_file = (course.link + '/syllabus.pdf').slice(1);
|
221 | }
|
222 | if (old_file) {
|
223 | new_file = (course.link + '/' + course.slug + '-Syllabus.pdf').slice(1);
|
224 | move_file(old_file, new_file, files);
|
225 | course.syllabus = "/" + new_file;
|
226 | }
|
227 | finished();
|
228 | }, function() {
|
229 | callback();
|
230 | });
|
231 | }
|
232 | ],
|
233 | function (err) {
|
234 | done(err);
|
235 | });
|
236 | }
|
237 | };
|