UNPKG

8.66 kBJavaScriptView Raw
1var _ = require('underscore'),
2 async = require('async'),
3 sort = require('./sort.js');
4
5var linkPeople = function(people, metadata) {
6 return _.compact(_.map(people, function(person) {
7 if (person.search('@') == -1) {
8 var person = person + '@buffalo.edu';
9 }
10 person_bio = _.find(metadata.people, function(p) {
11 return p.email === person;
12 });
13 if (person_bio === undefined) {
14 console.log('Missing bio for ' + person);
15 }
16 return person_bio;
17 }));
18};
19
20var linkPapers = function(papers, metadata) {
21 return _.compact(_.map(papers, function(paper) {
22 paper_summary = _.find(metadata.papers, function(p) {
23 return p.slug === paper;
24 });
25 if (paper_summary === undefined) {
26 console.log('Missing summary for ' + paper);
27 }
28 return paper_summary;
29 }));
30};
31
32var linkProjects = function(projects, metadata) {
33 return _.compact(_.map(projects, function (project) {
34 project_summary = _.find(metadata.projects, function(p) {
35 return p.slug === project;
36 });
37 if (project_summary === undefined) {
38 console.log('Missing summary for ' + project);
39 }
40 return project_summary;
41 }));
42};
43
44var linkProposals = function(proposals, metadata) {
45 return _.compact(_.map(proposals, function (proposal) {
46 proposal_summary = _.find(metadata.proposals, function(p) {
47 return p.slug === proposal;
48 });
49 if (proposal_summary === undefined) {
50 console.log('Missing summary for ' + proposal);
51 }
52 return proposal_summary;
53 }));
54};
55
56var paginate = function (iterable) {
57 prev = undefined;
58 _.each(iterable, function (elem) {
59 elem.previous_item = prev;
60 if (prev) {
61 prev.next_item = elem;
62 }
63 prev = elem;
64 });
65}
66
67module.exports = function(config) {
68 return function(files, metalsmith, done) {
69 var metadata = metalsmith.metadata();
70
71 metadata.people.group = _.filter(metadata.people, function (person) { return person.group });
72 metadata.people.long_alumni = _.filter(metadata.people, function (person) { return person.long_alumni });
73 var short_alumni = _.filter(metadata.people, function (person) { return person.short_alumni });
74 var collaborators = _.filter(metadata.people, function (person) { return person.collaborator });
75
76 metadata.people.short_alumni = {}
77 metadata.people.short_alumni.first = short_alumni.slice(0,Math.ceil(short_alumni.length / 2));
78 metadata.people.short_alumni.second = short_alumni.slice(Math.ceil(short_alumni.length / 2));
79
80 metadata.people.collaborators = {}
81 metadata.people.collaborators.first = collaborators.slice(0,Math.ceil(collaborators.length / 2));
82 metadata.people.collaborators.second = collaborators.slice(Math.ceil(collaborators.length / 2));
83
84 metadata.projects.active = _.filter(metadata.projects, function(project) {
85 return project.active;
86 }).sort(function(p1, p2) {
87 if (p1.started != p2.started) {
88 return p1.started > p2.started ? -1 : p1.started < p2.started ? 1 : 0;
89 } else {
90 return p1.name.toLowerCase() > p2.name.toLowerCase() ? 1 : -1;
91 }
92 });
93 metadata.projects.inactive = _.filter(metadata.projects, function(project) {
94 return !project.active;
95 }).sort(function(p1, p2) {
96 if (p1.ended != p2.ended) {
97 return p1.ended > p2.ended ? -1 : p1.ended < p2.ended ? 1 : 0;
98 } else {
99 return p1.name.toLowerCase() > p2.name.toLowerCase() ? 1 : -1;
100 }
101 });
102 paginate(metadata.projects.active.concat(metadata.projects.inactive));
103
104 async.series([
105 function (callback) {
106 async.each(metadata.projects, function(project, finished) {
107 project.people = linkPeople(project.people, metadata);
108 project.leads = linkPeople(project.leads, metadata);
109 project.papers = linkPapers(project.papers, metadata);
110 project.funding = linkProposals(project.funding, metadata);
111 finished();
112 },
113 function () {
114 callback();
115 });
116 },
117 function (callback) {
118 async.each(metadata.papers, function(paper, finished) {
119 paper.people = linkPeople(paper.people, metadata);
120 if (paper.presenters) {
121 paper.presenters = _.sortBy(linkPeople(paper.presenters, metadata), function (p) {
122 return p.name.toLowerCase();
123 });
124 }
125 paper.projects = linkProjects(paper.projects, metadata);
126 paper.funding = linkProposals(paper.funding, metadata);
127 finished();
128 },
129 function () {
130 paginate(metadata.papers);
131 callback();
132 });
133 },
134 function (callback) {
135 async.each(metadata.proposals, function(proposal, finished) {
136 proposal.faculty = linkPeople(proposal.faculty, metadata);
137 proposal.students = linkPeople(proposal.students, metadata);
138 projects = linkProjects(proposal.projects, metadata);
139 proposal.projects = {}
140 proposal.projects.active = _.filter(projects, function (project) {
141 return project.active;
142 });
143 proposal.projects.inactive = _.filter(projects, function (project) {
144 return !project.active;
145 });
146 proposal.papers = _.uniq(linkPapers(proposal.papers, metadata)).sort(sort.sort_papers);
147 proposal.list_papers = proposal.papers.length > 0;
148 proposal.projects.list = projects.length > 0;
149 finished();
150 },
151 function () {
152 paginate(metadata.proposals);
153 callback();
154 });
155 },
156 function (callback) {
157 async.each(metadata.courses, function(course, finished) {
158 course.instructors = _.sortBy(linkPeople(course.instructors, metadata), function (p) {
159 return p.name.toLowerCase();
160 });
161 course.staff = _.sortBy(linkPeople(course.staff, metadata), function (p) {
162 return p.name.toLowerCase();
163 });
164 if (course.volunteers) {
165 course.volunteers = _.sortBy(linkPeople(course.volunteers, metadata), function (p) {
166 return p.name.toLowerCase();
167 });
168 }
169 finished();
170 },
171 function () {
172 paginate(metadata.courses);
173 callback();
174 });
175 },
176 function (callback) {
177 async.each(metadata.people.group, function(person, finished) {
178 if (!person.nopapers) {
179 person.papers = _.filter(metadata.papers, function(paper) {
180 return _.contains(paper.people, person);
181 });
182 person.list_papers = person.papers.length > 0;
183 }
184 if (!person.noprojects) {
185 person.projects = {};
186 person.projects.leads = _.filter(metadata.projects.active, function(project) {
187 return _.contains(project.leads, person);
188 });
189 person.projects.active = _.filter(metadata.projects.active, function(project) {
190 return _.contains(project.people, person);
191 })
192 person.projects.inactive = _.filter(metadata.projects.inactive, function(project) {
193 return _.contains(project.people, person);
194 })
195 person.projects.list = (person.projects.leads.length +
196 person.projects.active.length +
197 person.projects.inactive.length) > 0;
198 }
199 if (!person.nocourses) {
200 person.courses = _.filter(metadata.courses, function (course) {
201 return _.contains(course.instructors, person) ||
202 _.contains(course.staff, person) ||
203 _.contains(course.volunteers, person);
204 });
205 person.list_courses = person.courses.length > 0;
206 }
207 finished();
208 },
209 function () {
210 paginate(metadata.people.group.concat(metadata.people.long_alumni));
211 callback();
212 });
213 },
214 function (callback) {
215 async.each(metadata.posts, function (post, finished) {
216 post.people = linkPeople(post.people, metadata);
217 post.full_url = "http://blue.cse.buffalo.edu/" + post.path;
218 finished();
219 },
220 function () {
221 paginate(metadata.visible_posts);
222 callback();
223 });
224 }
225 ],
226 function (err) {
227 done(err);
228 });
229 }
230};