Schedule
Detailed Course Schedule
This schedule is tentative! If we fall behind, topics and assignments may be moved to later weeks in the semester. All deadlines, unless otherwise noted, are at 11:59PM.
Each topic links to a PDF with slides, once available.
Code
function topicFormatter(day) {
if (day.slides) {
return htl.html`<td><a href="${day.slides}">${day.topic}</a></td>`;
} else {
return htl.html`<td>${day.topic}</td>`;
}
}
function assignmentFormatter(assigned) {
if (assigned) {
return htl.html`<td>${assigned.map(a => htl.html`${a.link && a.published !== false ? htl.html`<a href="${a.link}">${a.label}</a><br>` : htl.html`${a.label}<br>`}`)}</td>`;
} else {
return htl.html`<td></td>`;
}
}
function readingFormatter(readings) {
const buildReadingNote = reading => {
if (!reading.note) {
return null;
} else if (reading.note_href) {
return htl.html` (<a href=${reading.note_href}>${reading.note}</a>)`;
} else {
return htl.html` (${reading.note})`;
}
}
const readingMain = readings.map(reading => {
if (reading.topic) {
return htl.html`📚 <a href="${reading.link}">${reading.topic}</a> (${reading.sections})${buildReadingNote(reading)}<br>`;
} else if (reading.label){
return htl.html`📚 <a href="${reading.link}">${reading.label}</a>${buildReadingNote(reading)}<br>`;
} else {
// from a paper
return htl.html`📚 ${reading.authors} (${reading.year}), <a href="${reading.link}">${reading.title}</a>${buildReadingNote(reading)}<br>`;
}
});
return htl.html`${readingMain}`;
}
function activityFormatter(activities) {
if (!activities) {
return null;
}
const lis = activities.map(activity => htl.html`<li><a href="${activity.link}">${activity.label}</a></li>`);
return htl.html`Activities:<ul>${lis}</ul>`;
}
function buildTableRows(scheduleData) {
return scheduleData.map(week => {
const headerText = week.week == "Holiday" ? week.week : `Week ${week.week}`;
const header = htl.html`<tr><th colspan="6"><center>${headerText}</center></th></tr>`;
const body = week.days.map(day => {
const main = htl.html`<tr>
<td>${day.day}</td>
<td>${day.date}</td>
${topicFormatter(day)}
${assignmentFormatter(day.assigned)}
${assignmentFormatter(day.due)}
</tr>`;
let readingActivities = null;
if (day.reading || day.activities) {
readingActivities = htl.html`<tr><td colspan="5">${readingFormatter(day.reading)}${activityFormatter(day.activities)}</td></tr>`;
}
return htl.html.fragment`${main}${readingActivities}`;
});
return htl.html.fragment`${header}${body}`;
});
}
htl.html`<table class="table">
<thead>
<tr>
<th></th>
<th>Date</th>
<th>Topic</th>
<th>Assigned</th>
<th>Due</th>
</tr>
</thead>
<tbody>${buildTableRows(scheduleData)}</tbody>
</table>`