@@ -183,6 +183,7 @@ export async function scrapeCourse(
183183 let currentCredits = 0 ;
184184 let currentDescription = "" ;
185185 let currentPrereqs = "" ;
186+ let programName = "" ;
186187
187188 class CourseBlockHandler {
188189 element ( element : Element ) {
@@ -194,14 +195,17 @@ export async function scrapeCourse(
194195
195196 element . onEndTag ( ( ) => {
196197 if ( currentCode && currentTitle ) {
197- const codeMatch = currentCode . match ( / ( [ A - Z ] + (?: - [ A - Z ] + ) ? ) \s + ( \d + ) / ) ;
198+ const codeMatch = currentCode . match (
199+ / ( [ A - Z 0 - 9 ] + (?: - [ A - Z 0 - 9 ] + ) ? ) \s + ( \d + ) / ,
200+ ) ;
198201 if ( codeMatch ) {
199202 const [ , program , courseNumber ] = codeMatch ;
200203 const level = getCourseLevel ( program , courseNumber ) ;
201204
202205 courses . push ( {
203206 course : {
204207 program,
208+ programName : programName || "Unknown Program" ,
205209 code : currentCode ,
206210 level,
207211 title : currentTitle ,
@@ -259,7 +263,18 @@ export async function scrapeCourse(
259263 }
260264 }
261265
266+ class PageTitleHandler {
267+ text ( text : { text : string } ) {
268+ const titleText = text . text . trim ( ) ;
269+ const match = titleText . match ( / ^ ( [ ^ ( ] + ) \s + \( [ A - Z 0 - 9 - ] + \) $ / ) ;
270+ if ( match && ! programName ) {
271+ programName = match [ 1 ] . trim ( ) ;
272+ }
273+ }
274+ }
275+
262276 const rewriter = new HTMLRewriter ( )
277+ . on ( "h1.page-title" , new PageTitleHandler ( ) )
263278 . on ( ".courseblock" , new CourseBlockHandler ( ) )
264279 . on ( ".detail-code strong" , new CodeHandler ( ) )
265280 . on ( ".detail-title strong" , new TitleHandler ( ) )
@@ -277,8 +292,8 @@ function parsePrerequisites(text: string): CoursePrerequisite[] {
277292
278293 const cleanText = text . replace ( / ^ P r e r e q u i s i t e s ? : \s * / i, "" ) . trim ( ) ;
279294
280- // Match course codes
281- const coursePattern = / ( [ A - Z ] + (?: - [ A - Z ] + ) ? ) \s + ( \d + ) / g;
295+ // Match course codes (including codes with numbers like HRCM1-GC)
296+ const coursePattern = / ( [ A - Z 0 - 9 ] + (?: - [ A - Z 0 - 9 ] + ) ? ) \s + ( \d + ) / g;
282297 const matches = [ ...cleanText . matchAll ( coursePattern ) ] ;
283298
284299 if ( matches . length > 0 ) {
0 commit comments