1 | var _ = require('underscore'),
|
2 | async = require('async'),
|
3 | sort = require('./sort.js');
|
4 |
|
5 | var 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 |
|
20 | var 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 |
|
32 | var 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 |
|
44 | var 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 |
|
56 | var 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 |
|
67 | module.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 | };
|