diff --git a/schedule/config.php b/schedule/config.php index 3cdc9ee..9149f4d 100644 --- a/schedule/config.php +++ b/schedule/config.php @@ -4,8 +4,10 @@ function getSchedConfig($year = 2015) { 'lang' => 'bg', 'cfp_url' => 'https://cfp.openfest.org', 'cut_len' => 70, + 'hidden_speakers' => [4], + 'hidden_language_tracks' => [], ]; - + $config = [ 2014 => [ 'conferenceId' => 1, @@ -20,6 +22,7 @@ function getSchedConfig($year = 2015) { 'lecture' => 3, 'workshop' => 4, ], + 'hidden_language_tracks' => [16], ], 2016 => [ 'conferenceId' => 3, @@ -27,6 +30,7 @@ function getSchedConfig($year = 2015) { 'lecture' => 5, 'workshop' => 6, ], + 'hidden_language_tracks' => [25], ], ]; diff --git a/schedule/index.php b/schedule/index.php index e0116a1..06c8171 100644 --- a/schedule/index.php +++ b/schedule/index.php @@ -19,27 +19,9 @@ $content = parseData($sched_config, $data); - - - - - - - - - - - -
 
diff --git a/schedule/parse.php b/schedule/parse.php index bb080f2..30d8342 100644 --- a/schedule/parse.php +++ b/schedule/parse.php @@ -18,19 +18,18 @@ function parseData($config, $data) { ) ); - $microslots = []; - + // We need to set these so we actually parse properly the dates. WP fucks up both. + date_default_timezone_set('Europe/Sofia'); + setlocale(LC_TIME, $languages[$config['lang']]['locale']); + + // Filter out invalid slots $data['slots'] = array_filter($data['slots'], function($slot) { return isset($slot['starts_at'], $slot['ends_at'], $slot['hall_id'], $slot['event_id']); }); - $data['slots'] = array_map(function($slot) { - $slot['start'] = date('d.m H:i', $slot['starts_at']); - $slot['end'] = date('d.m H:i', $slot['ends_at']); - return $slot; - }, $data['slots']); - + // Collect the events for each hall, sort them in order of starting $events = []; + $microslots = []; foreach ($data['halls'] as $hall_id => $hall) { $events[$hall_id] = []; @@ -56,42 +55,29 @@ function parseData($config, $data) { sort($microslots); - $times = []; - - foreach ($microslots as $microslot) { - $times[$microslot] = date('d.m H:i', $microslot); - } - + // Find all microslots (the smallest time unit) $intervals = []; $lastTs = 0; - $last = ''; $first = true; - foreach ($times as $ts => $time) { + foreach ($microslots as $ts) { if ($first) { - $last = $time; $lastTs = $ts; $first = false; continue; } - if (date('d.m.Y', $lastTs) !== date('d.m.Y', $ts)) { - //echo PHP_EOL; - - $last = $time; + if (date('d.m', $lastTs) !== date('d.m', $ts)) { $lastTs = $ts; continue; } - //echo count($intervals), '. ', $last, ' - ', $time, PHP_EOL; $intervals[] = [$lastTs, $ts]; - $lastTs = $ts; - $last = $time; } - $schedule = []; - $hall_ids = array_keys($data['halls']); + // Fill in the event ID for each time slot in each hall + $slot_list = []; foreach ($data['halls'] as $hall_id => $hall) { $hall_data = []; @@ -119,177 +105,109 @@ function parseData($config, $data) { } } - $schedule[] = $hall_data; + $slot_list[] = $hall_data; } - $schedule = array_map(null, ...$schedule); - $table = '
'; + // Transpose the matrix + // rows->halls, cols->timeslots ===> rows->timeslots, cols->halls + $slot_list = array_map(null, ...$slot_list); - foreach ($hall_ids as $hall_id) { - $table .= ''; + // Build the HTML + $schedule = '
' . $data['halls'][$hall_id]['bg'] . '
'; + + foreach ($data['halls'] as $hall_id => $hall) { + $schedule .= ''; } - $table .= ''; + $schedule .= ''; $lastTs = 0; - foreach ($schedule as $slot_index => $events) { + foreach ($slot_list as $slot_index => $events) { $columns = []; $hasEvents = false; if (date('d.m', $intervals[$slot_index][0]) !== date('d.m', $lastTs)) { - $table .= ''; + $schedule .= ''; } $lastTs = $intervals[$slot_index][0]; $lastEventId = 0; + $colspan = 1; - foreach ($events as $hall_index => $event) { - if (is_null($event['event_id']) || !array_key_exists($event['event_id'], $data['events'])) { + foreach ($events as $hall_index => $hall_data) { + if (is_null($hall_data['event_id']) || !array_key_exists($hall_data['event_id'], $data['events'])) { $columns[] = ''; continue; } - if ($event['edge']) { + if ($hall_data['edge']) { $hasEvents = true; } - if ($lastEventId === $event['event_id']) { - $lastColumn = array_pop($columns); - $lastColumn = preg_replace_callback('//', function($matches) { - $colspan = array_key_exists(1, $matches) ? intval($matches[1]) + 1 : 2; - return ''; - $lastEventId = $event['event_id']; + $title = mb_substr($event['title'], 0, $config['cut_len']) . (mb_strlen($event['title']) > $config['cut_len'] ? '...' : ''); + $speakers = ''; + + if (count($event['participant_user_ids']) > 0) { + $spk = array(); + $speaker_name = array(); + foreach ($event['participant_user_ids'] as $uid) { + if (in_array($uid, $config['hidden_speakers']) || empty($data['speakers'][$uid])) { + continue; + } + + $name = $data['speakers'][$uid]['first_name'] . ' ' . $data['speakers'][$uid]['last_name']; + $spk[$uid] = '' . $name . ''; + } + $speakers = implode (', ', $spk); + } + + if (in_array($event['track_id'], $config['hidden_language_tracks'])) { + $csslang = ''; + } else { + $csslang = 'schedule-' . $event['language']; + } + + $cssclass = &$data['tracks'][$event['track_id']]['css_class']; + $style = ' class="' . $cssclass . ' ' . $csslang . '"'; + $content = '' . htmlspecialchars($title) . '
' . $speakers; + + /* these are done by $eid, as otherwise we get some talks more than once (for example the lunch) */ + $fulltalks .= '
'; + /* We don't want '()' when we don't have a speaker name */ + $fulltalk_spkr = strlen($speakers) > 0 ? (' (' . $speakers . ')') : ''; + $fulltalks .= '

' . $event['title'] . ' ' . $fulltalk_spkr . '

'; + $fulltalks .= '

' . $event['abstract'] . '

'; + $fulltalks .= '
'; +/* + if ($eid === $lastEventId) { + array_pop($columns); + ++$colspan; + } + else { + $colspan = 1; + } +*/ + $columns[] = ' 1 ? ' colspan="' . $colspan . '"' : '') . '>' . $content . ''; + $lastEventId = $eid; } if (!$hasEvents) { continue; } - $table .= ''; - $table .= implode('', $columns); - $table .= ''; + $schedule .= ''; + $schedule .= implode('', $columns); + $schedule .= ''; } - $table .= '
' . $hall['bg'] . '
' . date('d.m', $intervals[$slot_index][0]) . '
' . strftime('%d %B - %A', $intervals[$slot_index][0]) . '
 '; - }, $lastColumn); - $columns[] = $lastColumn; - continue; - } + $eid = &$hall_data['event_id']; + $event = &$data['events'][$eid]; - $columns[] = '' . $data['events'][$event['event_id']]['title'] . ' (' . $event['event_id'] . ')
'; - $table .= date('H:i', $intervals[$slot_index][0]) . ' - ' . date('H:i', $intervals[$slot_index][1]); - $table .= '
'; + $schedule .= strftime('%H:%M', $intervals[$slot_index][0]) . ' - ' . strftime('%H:%M', $intervals[$slot_index][1]); + $schedule .= '
'; + $schedule .= ''; - echo $table; - //var_dump($schedule); - exit; - - /* We need to set these so we actually parse properly the dates. WP fucks up both. */ - date_default_timezone_set('Europe/Sofia'); - setlocale(LC_TIME, $languages[$config['lang']]['locale']); - - foreach ($data['slots'] as $slot) { - $slotTime = $slot['starts_at']; - $slotDate = date('d', $slotTime); - - if ($slotDate !== $date) { - $lines[] = ''; - $lines[] = '' . strftime('%d %B - %A', $slotTime) . ''; - $lines[] = ' '; - $lines[] = ''; - - $date = $slotDate; - } - - if ($slotTime !== $time) { - if ($time !== 0) { - $lines[] = ''; - } - - $lines[] = ''; - $lines[] = '' . date('H:i', $slot['starts_at']) . ' - ' . date('H:i', $slot['ends_at']) . ''; - - $time = $slotTime; - } - - $eid = &$slot['event_id']; - - if (!array_key_exists($eid, $data['events'])) { - continue; - } - - $event = &$data['events'][$eid]; - - if ( - array_key_exists('filterEventType', $config) && - array_key_exists($config['filterEventType'], $config['eventTypes']) - ) { - if ($config['eventTypes'][$config['filterEventType']] !== $event['event_type_id']) { - continue; - } - } - - if (is_null($eid)) { - $lines[] = 'TBA'; - } - else { - $title = mb_substr($event['title'], 0, $config['cut_len']) . (mb_strlen($event['title']) > $config['cut_len'] ? '...' : ''); - $speakers = ''; - - if (count($event['participant_user_ids']) > 0) { - $speakers = json_encode($event['participant_user_ids']) . '
'; - - $spk = array(); - $speaker_name = array(); - foreach ($event['participant_user_ids'] as $uid) { - /* The check for uid==4 is for us not to show the "Opefest Team" as a presenter for lunches, etc. */ - if ($uid == 4 || empty ($data['speakers'][$uid])) { - continue; - } else { - /* TODO: fix the URL */ - $name = $data['speakers'][$uid]['first_name'] . ' ' . $data['speakers'][$uid]['last_name']; - $spk[$uid] = '' . $name . ''; - } - } - $speakers = implode (', ', $spk); - } - - - /* Hack, we don't want language for the misc track. This is the same for all years. */ - if ('misc' !== $data['tracks'][$event['track_id']]['name']['en']) { - $csslang = 'schedule-' . $event['language']; - } else { - $csslang = ''; - } - $cssclass = &$data['tracks'][$event['track_id']]['css_class']; - $style = ' class="' . $cssclass . ' ' . $csslang . '"'; - $content = '' . htmlspecialchars($title) . '
' . $speakers; - - - /* these are done by $eid, as otherwise we get some talks more than once (for example the lunch) */ - $fulltalks .= '
'; - /* We don't want '()' when we don't have a speaker name */ - $fulltalk_spkr = strlen($speakers)>1 ? ' (' . $speakers . ')' : ''; - $fulltalks .= '

' . $event['title'] . ' ' . $fulltalk_spkr . '

'; - $fulltalks .= '

' . $event['abstract'] . '

'; - $fulltalks .= '
'; - - if ($slot['event_id'] === $prev_event_id) { - array_pop($lines); - $lines[] = '' . $content . ''; - } - else { - $lines[] = '' . $content . ''; - $colspan = 1; - } - } - - $prev_event_id = $slot['event_id']; - } - - $lines[] = ''; - - /* create the legend */ + // Create the legend $legend = ''; foreach($data['tracks'] as $track) { @@ -299,7 +217,8 @@ function parseData($config, $data) { foreach ($languages as $code => $lang) { $legend .= '' . $lang['name'] . ''; } - + + // Speaker list $gspk = '
'; $fspk = ''; $types = [ @@ -343,5 +262,5 @@ function parseData($config, $data) { $gspk .= '
'; - return compact('lines', 'fulltalks', 'gspk', 'fspk', 'legend'); + return compact('schedule', 'fulltalks', 'gspk', 'fspk', 'legend'); }