@@ -45,8 +45,9 @@ export const parser2025Spring: CourseParser = {
4545 timezone : 'Asia/Shanghai'
4646 } ;
4747 const calendar = extendCalendar ( baseCalendar , stats ) ;
48- // 2025-16 is a 16-week term; this value affects upper/lower splitting for clip-path rendering.
49- const weeks = stats . maxWeek > 0 ? stats . maxWeek : 16 ;
48+ // 2025-16 is a 16-week term; do NOT infer the term length from week tokens, as some entries may
49+ // contain out-of-band numbers that would break half-term classification (e.g. 9-16 should be 下半学期).
50+ const weeks = 16 ;
5051
5152 const courses = new Map < string , CourseRecord > ( ) ;
5253 const courseHashMap = new Map < string , string > ( ) ;
@@ -315,14 +316,16 @@ function projectToMatrix(chunks: ScheduleChunk[], calendar: CalendarConfig, maxW
315316
316317function buildWeekPattern ( descriptor : WeekDescriptor , maxWeeks : number ) : WeekPattern {
317318 const weeks = expandWeeks ( descriptor , maxWeeks ) ;
318- const half = Math . ceil ( maxWeeks / 2 ) ;
319+ // SHU half-term convention: the "second half" starts at week floor(maxWeeks/2)+1.
320+ // Example (16 weeks): upper = 1-8, lower = 9-16, so "9-16" should be 下半学期.
321+ const secondHalfStart = Math . floor ( maxWeeks / 2 ) + 1 ;
319322
320323 const span : WeekPattern [ 'span' ] =
321324 ! weeks || weeks . length === 0
322325 ? '全学期'
323- : weeks . every ( ( week ) => week <= half )
326+ : weeks . every ( ( week ) => week < secondHalfStart )
324327 ? '上半学期'
325- : weeks . every ( ( week ) => week > half )
328+ : weeks . every ( ( week ) => week >= secondHalfStart )
326329 ? '下半学期'
327330 : '全学期' ;
328331
0 commit comments