/** * Show the 'Daily' page. * * @param PageBuilder $pageBuilder Template engine wrapper. * @param LinkDB $LINKSDB LinkDB instance. */ function showDaily($pageBuilder, $LINKSDB) { $day = Date('Ymd', strtotime('-1 day')); // Yesterday, in format YYYYMMDD. if (isset($_GET['day'])) { $day = $_GET['day']; } $days = $LINKSDB->days(); $i = array_search($day, $days); if ($i === false) { $i = count($days) - 1; $day = $days[$i]; } $previousday = ''; $nextday = ''; if ($i !== false) { if ($i >= 1) { $previousday = $days[$i - 1]; } if ($i < count($days) - 1) { $nextday = $days[$i + 1]; } } try { $linksToDisplay = $LINKSDB->filterDay($day); } catch (Exception $exc) { error_log($exc); $linksToDisplay = array(); } // We pre-format some fields for proper output. foreach ($linksToDisplay as $key => $link) { $taglist = explode(' ', $link['tags']); uasort($taglist, 'strcasecmp'); $linksToDisplay[$key]['taglist'] = $taglist; $linksToDisplay[$key]['formatedDescription'] = format_description($link['description'], $GLOBALS['redirector']); $linksToDisplay[$key]['thumbnail'] = thumbnail($link['url']); $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); $linksToDisplay[$key]['timestamp'] = $date->getTimestamp(); } /* We need to spread the articles on 3 columns. I did not want to use a JavaScript lib like http://masonry.desandro.com/ so I manually spread entries with a simple method: I roughly evaluate the height of a div according to title and description length. */ $columns = array(array(), array(), array()); // Entries to display, for each column. $fill = array(0, 0, 0); // Rough estimate of columns fill. foreach ($linksToDisplay as $key => $link) { // Roughly estimate length of entry (by counting characters) // Title: 30 chars = 1 line. 1 line is 30 pixels height. // Description: 836 characters gives roughly 342 pixel height. // This is not perfect, but it's usually OK. $length = strlen($link['title']) + 342 * strlen($link['description']) / 836; if ($link['thumbnail']) { $length += 100; } // 1 thumbnails roughly takes 100 pixels height. // Then put in column which is the less filled: $smallest = min($fill); // find smallest value in array. $index = array_search($smallest, $fill); // find index of this smallest value. array_push($columns[$index], $link); // Put entry in this column. $fill[$index] += $length; } $dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day . '_000000'); $data = array('linksToDisplay' => $linksToDisplay, 'cols' => $columns, 'day' => $dayDate->getTimestamp(), 'previousday' => $previousday, 'nextday' => $nextday); $pluginManager = PluginManager::getInstance(); $pluginManager->executeHooks('render_daily', $data, array('loggedin' => isLoggedIn())); foreach ($data as $key => $value) { $pageBuilder->assign($key, $value); } $pageBuilder->renderPage('daily'); exit; }
function showDaily() { $LINKSDB = new LinkDB($GLOBALS['config']['DATASTORE'], isLoggedIn() || $GLOBALS['config']['OPEN_SHAARLI'], $GLOBALS['config']['HIDE_PUBLIC_LINKS']); $day = Date('Ymd', strtotime('-1 day')); // Yesterday, in format YYYYMMDD. if (isset($_GET['day'])) { $day = $_GET['day']; } $days = $LINKSDB->days(); $i = array_search($day, $days); if ($i === false) { $i = count($days) - 1; $day = $days[$i]; } $previousday = ''; $nextday = ''; if ($i !== false) { if ($i >= 1) { $previousday = $days[$i - 1]; } if ($i < count($days) - 1) { $nextday = $days[$i + 1]; } } try { $linksToDisplay = $LINKSDB->filterDay($day); } catch (Exception $exc) { error_log($exc); $linksToDisplay = array(); } // We pre-format some fields for proper output. foreach ($linksToDisplay as $key => $link) { $taglist = explode(' ', $link['tags']); uasort($taglist, 'strcasecmp'); $linksToDisplay[$key]['taglist'] = $taglist; $linksToDisplay[$key]['formatedDescription'] = nl2br(keepMultipleSpaces(text2clickable($link['description']))); $linksToDisplay[$key]['thumbnail'] = thumbnail($link['url']); $linksToDisplay[$key]['timestamp'] = linkdate2timestamp($link['linkdate']); } /* We need to spread the articles on 3 columns. I did not want to use a JavaScript lib like http://masonry.desandro.com/ so I manually spread entries with a simple method: I roughly evaluate the height of a div according to title and description length. */ $columns = array(array(), array(), array()); // Entries to display, for each column. $fill = array(0, 0, 0); // Rough estimate of columns fill. foreach ($linksToDisplay as $key => $link) { // Roughly estimate length of entry (by counting characters) // Title: 30 chars = 1 line. 1 line is 30 pixels height. // Description: 836 characters gives roughly 342 pixel height. // This is not perfect, but it's usually OK. $length = strlen($link['title']) + 342 * strlen($link['description']) / 836; if ($link['thumbnail']) { $length += 100; } // 1 thumbnails roughly takes 100 pixels height. // Then put in column which is the less filled: $smallest = min($fill); // find smallest value in array. $index = array_search($smallest, $fill); // find index of this smallest value. array_push($columns[$index], $link); // Put entry in this column. $fill[$index] += $length; } $PAGE = new pageBuilder(); $PAGE->assign('linksToDisplay', $linksToDisplay); $PAGE->assign('linkcount', count($LINKSDB)); $PAGE->assign('cols', $columns); $PAGE->assign('day', linkdate2timestamp($day . '_000000')); $PAGE->assign('previousday', $previousday); $PAGE->assign('nextday', $nextday); $PAGE->renderPage('daily'); exit; }