// date defDict month = January,February,March,April,May,June,July,August,September,October,November,December,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Sept,Oct,Nov,Dec; defDict weekday = Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sun,Mon,Tue,Tues,Wed,Thu,Thurs,Fri,Sat; defDict longweekday = Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday; defDict dayEnd = st,nd,rd,th; defSpanType date =: ... [ ai(month) '.'? re('^\n$')? re('^\d\d?$') ai(dayEnd)? ] !eqi('pm') ...; // Sept. 23rd defSpanType date =: ... [ re('^\d\d?$') ai(dayEnd)? ai(month) ] ...; // 23rd Sept defSpanType date =: ... [ re('^\d\d?$') ai(dayEnd) eqi('of') ai(month) ] ...; // 23rd of Sept defSpanType date =: ... [ @date ','? re('^[0-9]{4,4}$') ] ...; // @date, 2003 defSpanType date =: ... [ @date ',' re('^0[1-9]$') ] ...; // @date, 03 defSpanType date =: ... [ re('^\d\d?$') '/' re('^\d\d?$') ] ...; // 08/22 defSpanType date =: ... [ re('^\d\d?$') '/' re('^\d\d?$') '/' re('^\d{2,4}$') ] ...; // 08/22/80 defSpanType date =: ... [ re('^\d\d?$') '-' re('^\d\d?$') '-' re('^\d{2,4}$') ] ...; // 08-22-80 defSpanType date =: ... [ re('^\d{2,4}$') '-' re('^\d\d?$') '-' re('^\d\d?$') ] ...; // 2004-08-22 defSpanType date =: ... [ '*' ai(weekday) '*' @date ] ...; // *Thursday* @date defSpanType date =: ... [ ai(weekday) '(' @date ')' ] ...; // Thursday (@date) defSpanType date =: ... [ @date '(' ai(weekday) ')' ] ...; // @date (Thursday) defSpanType date =: ... [ ai(weekday) ','? re('^\n$')? @date ] ...; // Thursday, @date defSpanType date =: ... [ ai(weekday) '/' @date ] ...; // Thursday/@date defSpanType date =: ... [ @date ','? ai(weekday) ] ...; // @date, Thursday defSpanType date =: ... [ ai(weekday) re('^\d\d?$') ai(dayEnd) ] ...; // Thursday 23rd defSpanType date =: ... [ ai(month) re('^\d\d?$') '(' ai(weekday) ')' ',' re('^\d{2,4}$') ] ...; // May 26 (Wed), 2004 // time defSpanType ampm =: ... [ re('^[AaPp][Mm]$') ] ...; // am defSpanType ampm =: ... [ re('^[AaPp]$') '.' eqi('m') '.' ] ...; // a.m. defSpanType timeroot =: ... [ re('^[0-1]?\d$') re('^[:.]$') re('^[0-5]\d$') ] ...; // 2:00 defSpanType timedash =: ... [ eqi('to') ] ...; defSpanType timedash =: ... [ '-' ] ...; defSpanType timedash =: ... [ '-' '-' ] ...; defSpanType time =: ... [ @timeroot ] ...; // 2:00 defSpanType time =: ... [ @timeroot re('^\n$')? @ampm ] ...; // 2:00am defSpanType time =: ... [ re('^1?\d$') @ampm ] ...; // 3pm defSpanType time =: ... [ @time @timedash @time ] ...; // 2:00 - 3:00 pm defSpanType time =: ... [ re('^[1-9]$') @timedash @time ] ...; // 2 - 3:00 pm defSpanType time =: ... [ re('^1[0-2]$') @timedash @time ] ...; // 10 - 11:00 am defSpanType time =: ... [ @time '(' eqi('GMT') '+' re('^\d\d$') ':' re('^\d\d$') ')' ] ...; // 2pm (GMT+08:00) defSpanType time =: ... [ eqi('noon') ] ...; // Noon defSpanType time =: ... [ '12' ':' '00' eqi('noon') ] ...; // 12:00 Noon // location // manually encode CMU/MSRA buildings defDict buildings = Wean, WeH, WeanHall, NSH; defSpanType building =: ... [ ai(buildings) ] ...; // Wean, WeH, WeanHall, NSH defSpanType building =: ... [ eqi('newell') '-'? eqi('simon') eqi('hall')? ] ...; // Newell-Simon Hall defSpanType building =: ... [ eqi('wean') eqi('hall') ] ...; // Wean Hall defSpanType building =: ... [ eqi('baker') eqi('hall') ] ...; // Baker Hall defSpanType building =: ... [ eqi('scaife') eqi('hall') ] ...; // Scaife Hall defSpanType building =: ... [ eqi('university') eqi('center') ] ...; // University Center defSpanType building =: ... [ eqi('sigma') eqi('building') ] ...; // Sigma Building defSpanType room =: ... [ re('^\d{3,4}$') re('^[A-Z]$')? ] ...; // 3305A defSpanType room =: ... [ eqi('room') '#' re('^\d+$') ] ...; // Room #4623 defSpanType room =: ... [ re('^[A-Z][a-zA-Z]*$') eqi('auditorium') ] ...; // McConomy Auditorium defSpanType room =: ... [ re('^[A-Z][a-zA-Z]*$') eqi('wing') ] ...; // Adamson Wing defSpanType room =: ... [ eqi('auditorium') ] ...; // Auditorium defSpanType floor =: ... [ ',' re('^\d$') '/'? 'F' ] ...; // , 6/F defSpanType floor =: ... [ '(' re('^\d$') '/'? 'F' ')' ] ...; // (6F) defTokenProp building_or_room:1 =: ... [ @building ] ...; defTokenProp building_or_room:1 =: ... [ @room ] ...; defSpanType location =: ... [ @building '-'? re('^\n$')? @room ] ...; // NSH 3305 defSpanType location =: ... [ re('^[A-Z][a-zA-Z]*$') eqi('room') @floor? ] ...; // Windows Room, 3F defSpanType location =: ... [ re('^[A-Z][a-zA-Z]*$') eqi('room') @floor? ',' @building ] ...; // AV Room, 3F, Sigma defSpanType location =: ... [ re('^[A-Z][a-zA-Z]*$') eqi('ballroom') @floor? ] ...; // Rangos Ballroom defSpanType location =: ... [ @room ','? @building ] !building_or_room:1 ...; // 3305 NSH // title defDict title_label = title, topic; defTokenProp not_eot:1 =: ... [ !re('^[\n."]$') ] ...; defSpanType title =: ... ai(title_label) ':' [ not_eot:1+ R ] re('^\n$') re('^\n$') ...; // Topic: A Topic defSpanType title =: ... ai(title_label) ':' '"' [ re('^[^"]+$')+ R ] '"' ...; // Topic: A Topic defDict bad_title_start = title, topic, host, abstract, bio; defSpanType title =: ... 'LTISeminar' '/' re('^[\n-]$')* R [ !ai(bad_title_start) not_eot:1+ R ] ...; defTokenProp caps_colon:1 =: ... [ re('^[A-Z:]+$') ] ...; defSpanType title =: ... '"' [ caps_colon:1+ R ] '"' ...; // "MAKING MARKETS WORK" defSpanType title =: ... re('^\n$'){2,2} re('^\n$')+ R [ !ai(bad_title_start) caps_colon:1+ R ] re('^\n$'){2,2} ...; defSpanType title =: ... re('^\n$'){2,2} re('^\n$')+ R [ !ai(bad_title_start) caps_colon:1+ re('^\n$') caps_colon:1+ R ] re('^\n$'){2,2} ...; // name defDict names="data/allnames.txt"; defDict prefix=mr,dr,ms,mrs,prof; defTokenProp name:1 =: ... [ ai(names) ] ...; defTokenProp cap:1 =: ... [ re('^[A-Z]') ] ...; defTokenProp pre_name:1 =: ... [ re('^\n$') ] ... || ... [ re('^:$') ] ...; defTokenProp post_name:1 =: ... [ re('^\n$') ] ... || ... [ re('[/]') ] ...; defSpanType name =: ... pre_name:1 [ {2,3} ] post_name:1 ...; defSpanType name =: ... pre_name:1 [ re('^[A-Z]$') '.' ] post_name:1 ...; defSpanType name =: ... pre_name:1 [ ai(prefix) '.'? {2,3} ] post_name:1 ...; defSpanType name =: ... pre_name:1 [ ai(prefix) '.'? re('^[A-Z]$') '.' ] post_name:1 ...; // series //defDict series_word = series, seminar, lecture; //defDict bad_series_word = a, an, this, -, [; //defTokenProp bad_series_start:1 =: ... [ ai(bad_series_word) ] ... || ... [ re('^\n$') ] ... || ... [ ai(series_word) ] ... || ... [ re('^[a-z]') ] ... || ... [ re('^[/:>";.]$') ] ...; //defSpanType series =: ... [ !bad_series_start:1+ R ai(series_word){1,2} ] ...; defDict end_series_word = series, seminar, lecture; defDict pre_start_series_word = a, an, this, about; defTokenProp bad_start_series:1 =: ... [ ai(pre_start_series_word) ] ... || ... [ re('^[a-z0-9*]') ] ...; defTokenProp cant_continue_series:1 =: ... [ ai(end_series_word) ] ... || ... [ re('^\n$') ] ...; defTokenProp end_series:1 =: ... [ ai(end_series_word) ] ...; defSpanType series =: ... re('^\n$')+ R ai(pre_start_series_word)? [ !bad_start_series:1 !cant_continue_series:1+ R end_series:1 ] re('^\n$')...;