. */ //-------------------------------------------------- // class.section.php Author:Nathan Gelderloos // // Represents a section of a class. //-------------------------------------------------- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'class.section_meeting.inc'; class Section { private $letter; // Section letter private $prof; // Professor /* meeting times, array of SectionMeeting */ private $meetings; /* the section synonym which uniquely identifies this section/course combination */ private $synonym; /** * \brief * Construct a Section. * * \param $letter * The identifier (often a letter or numeral) of this section. For * CS-262-A, this would be 'a'. * \param $section_meetings * An array of SectionMeeting objects which describe all the * different types of meetings this particular section has. It * will be very uncommon for a course to have more than one such * meeting time for a section. For example, Calvin doesn't have * this. Another example, Cedarville lists different meeting times * inside of a single section. Cedarville also lists all lectures * and lab meeting times directly in a section's listing. * \param $synonym * Some schools have a unique number for each section. This field * is for that number. * \param $prof * The faculty person(s) who teaches this section. */ function __construct ($letter, array $section_meetings = array(), $synonym = NULL, $prof = NULL) { $this->letter = $letter; $this->meetings = $section_meetings; $this->synonym = $synonym; $this->prof = $prof; } public function getLetter() { return $this->letter; } public function getProf() { return $this->prof; } /** * \return * This section's synonym -- a unique numeric identifier for this * course. NULL if undefined. */ public function getSynonym() { return $this->synonym; } /** * \brief * Get an array of section meetings for this section. * * \return * An array of SectionMeeting objects. */ public function getMeetings() { return $this->meetings; } /** * \brief * Check if this section conflicts with the given section. * * \param $that * The other section for which I should check for conflicts. * \return * TRUE if there is a conflict, FALSE otherwise. */ public function conflictsWith(Section $that) { foreach ($this->meetings as $this_meeting) foreach ($that->meetings as $that_meeting) if ($this_meeting->conflictsWith($that_meeting)) return TRUE; return FALSE; } /** * \brief * Add another section meeting time to this section. * * Useful for process.php when it's calling * Schedule::addSectionMeeting() multiple times. */ public function meeting_add(SectionMeeting $meeting) { $this->meetings[] = $meeting; } /** * \brief * Splits up a section specifier into dept, course number, and * section. * * For example, will return array('CS', '262', 'A') for 'CS-262-A' * or 'CS262 A' or 'cs-262,a'. This function is not for dealing with * course synonyms. * * Note: Section specifiers where the section numeral/letter is * directly adjacent to the course number is not valid. Calvin * College distinguishes between normal courses and their labs by * appending an `L' to the course number. Thus, 'CS262A' is not a * valid specifier for 'CS-262-A' because there may exist another * course called 'CS-262L-A' (which is likely the lab for the * 'CS-262-A' class ;-)). * * \param $section_spec * A string starting with a section specifier. If only the * department is found, an array of size one is returned. If the * course number is also found, both department and course id are * returned. If all three are found, the array has three elements. * * This array is keyed, so the found items may be referred to as * 'deptartment', 'course', and 'section'. * * \return * An array with the department, course number, and section * identifier. This array may be empty or have from one through * three elements depending on the validity and precision of the * $section_spec. */ public static function parse($section_spec) { $ret = array(); $section_spec = trim($section_spec); if (!preg_match(';([a-zA-Z]+)[^0-9]*;', $section_spec, $dept_matches)) return $ret; /* * remove away the already-parsed stuff, including gunk between the * dept and the course num. */ $section_spec = trim(substr($section_spec, strlen($dept_matches[0]))); $ret['department'] = strtoupper($dept_matches[1]); if (!preg_match(';([0-9a-zA-Z]+)[^a-zA-Z0-9]*;', $section_spec, $course_matches)) return $ret; /* skip gunk */ $section_spec = trim(substr($section_spec, strlen($course_matches[0]))); $ret['course'] = strtoupper($course_matches[1]); /* * we accept fully alphanumeric section identifiers. ccbcmd uses * these amazingly. */ if (!preg_match(';([a-zA-Z0-9]+);', $section_spec, $section_matches)) return $ret; $ret['section'] = strtoupper($section_matches[1]); return $ret; } /** * \brief * Get arrays of information needed by the AJAX stuff. * * \return * An array of arrays that should be merged with the return value * of other Section::to_json_array() calls. */ public function to_json_arrays() { $json_arrays = array(); foreach ($this->meetings as $meeting) { $json_array = array('section' => $this->letter, 'prof' => $this->prof, 'synonym' => $this->synonym, ); $json_array += $meeting->to_json_array(); $json_arrays[] = $json_array; } return $json_arrays; } /* for legacy unserialization */ private $start; private $tend; private $bdays; /** * \brief * A magic function which tries to upgrade old serialized sections * to the new format. */ public function __wakeup() { /* upgrade to SectionMeeting stuffage */ if (!empty($this->start)) { $days = ''; $daymap = array(0 => 'm', 1 => 't', 2 => 'w', 3 => 'h', 4 => 'f'); foreach ($this->bdays as $day => $have_day) if ($have_day) $days .= $daymap[$day]; /* the old format had a ->prof but initialied it to ``unknown prof'' */ $this->prof = ''; $this->meetings = array(); $this->meeting_add(new SectionMeeting($days, $this->start, $this->tend, '', 'lecture')); /* * if we're reserialized in the future, make sure we don't do this same upgrade procedure again ;-). */ unset($this->start); } } }