UNPKG

9.33 kBJavaScriptView Raw
1var path = require('path'),
2 async = require('async'),
3 cheerio = require('cheerio'),
4 common = require('./common.js');
5
6function 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
13module.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};