From: Arthur Date: Wed, 24 Feb 2016 18:26:57 +0000 (+0100) Subject: Merge pull request #492 from ArthurHoaro/locale-sort-fix X-Git-Tag: v0.6.4~5 X-Git-Url: https://git.immae.eu/?a=commitdiff_plain;h=fa40b43f60c5367fc28a22d05c3f344ce39340c6;hp=-c;p=github%2Fshaarli%2FShaarli.git Merge pull request #492 from ArthurHoaro/locale-sort-fix Fixes #481: tag cloud fatal error --- fa40b43f60c5367fc28a22d05c3f344ce39340c6 diff --combined index.php index 5bd9cac4,231b63f6..a9264cbb --- a/index.php +++ b/index.php @@@ -268,7 -268,7 +268,7 @@@ $GLOBALS['redirector'] = !empty($GLOBAL // a token depending of deployment salt, user password, and the current ip define('STAY_SIGNED_IN_TOKEN', sha1($GLOBALS['hash'].$_SERVER["REMOTE_ADDR"].$GLOBALS['salt'])); - autoLocale(); // Sniff browser language and set date format accordingly. + autoLocale($_SERVER['HTTP_ACCEPT_LANGUAGE']); // Sniff browser language and set date format accordingly. header('Content-Type: text/html; charset=utf-8'); // We use UTF-8 for proper international characters handling. //================================================================================================== @@@ -315,26 -315,6 +315,6 @@@ function setup_login_state() } $userIsLoggedIn = setup_login_state(); - - // ------------------------------------------------------------------------------------------ - // Sniff browser language to display dates in the right format automatically. - // (Note that is may not work on your server if the corresponding local is not installed.) - function autoLocale() - { - $attempts = array('en_US'); // Default if browser does not send HTTP_ACCEPT_LANGUAGE - if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) // e.g. "fr,fr-fr;q=0.8,en;q=0.5,en-us;q=0.3" - { // (It's a bit crude, but it works very well. Preferred language is always presented first.) - if (preg_match('/([a-z]{2})-?([a-z]{2})?/i',$_SERVER['HTTP_ACCEPT_LANGUAGE'],$matches)) { - $loc = $matches[1] . (!empty($matches[2]) ? '_' . strtoupper($matches[2]) : ''); - $attempts = array($loc.'.UTF-8', $loc, str_replace('_', '-', $loc).'.UTF-8', str_replace('_', '-', $loc), - $loc . '_' . strtoupper($loc).'.UTF-8', $loc . '_' . strtoupper($loc), - $loc . '_' . $loc.'.UTF-8', $loc . '_' . $loc, $loc . '-' . strtoupper($loc).'.UTF-8', - $loc . '-' . strtoupper($loc), $loc . '-' . $loc.'.UTF-8', $loc . '-' . $loc); - } - } - setlocale(LC_TIME, $attempts); // LC_TIME = Set local for date/time format only. - } - // ------------------------------------------------------------------------------------------ // PubSubHubbub protocol support (if enabled) [UNTESTED] // (Source: http://aldarone.fr/les-flux-rss-shaarli-et-pubsubhubbub/ ) @@@ -551,6 -531,33 +531,6 @@@ function getMaxFileSize( return $maxsize; } -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a timestamp (Unix epoch) - (used to build the ADD_DATE attribute in Netscape-bookmarks file) - PS: I could have used strptime(), but it does not exist on Windows. I'm too kind. */ -function linkdate2timestamp($linkdate) -{ - if(strcmp($linkdate, '_000000') !== 0 || !$linkdate){ - $Y=$M=$D=$h=$m=$s=0; - $r = sscanf($linkdate,'%4d%2d%2d_%2d%2d%2d',$Y,$M,$D,$h,$m,$s); - return mktime($h,$m,$s,$M,$D,$Y); - } - return time(); -} - -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a RFC822 date. - (used to build the pubDate attribute in RSS feed.) */ -function linkdate2rfc822($linkdate) -{ - return date('r',linkdate2timestamp($linkdate)); // 'r' is for RFC822 date format. -} - -/* Converts a linkdate time (YYYYMMDD_HHMMSS) of an article to a ISO 8601 date. - (used to build the updated tags in ATOM feed.) */ -function linkdate2iso8601($linkdate) -{ - return date('c',linkdate2timestamp($linkdate)); // 'c' is for ISO 8601 date format. -} - // ------------------------------------------------------------------------------------------ // Token management for XSRF protection // Token should be used in any form which acts on data (create,update,delete,import...). @@@ -742,16 -749,14 +722,16 @@@ function showRSS( { $link = $linksToDisplay[$keys[$i]]; $guid = $pageaddr.'?'.smallHash($link['linkdate']); - $rfc822date = linkdate2rfc822($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); $absurl = $link['url']; if (startsWith($absurl,'?')) $absurl=$pageaddr.$absurl; // make permalink URL absolute if ($usepermalinks===true) echo ''.$link['title'].''.$guid.''.$guid.''; else echo ''.$link['title'].''.$guid.''.$absurl.''; - if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) echo ''.escape($rfc822date)."\n"; + if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) { + echo ''.escape($date->format(DateTime::RSS))."\n"; + } if ($link['tags']!='') // Adding tags to each RSS entry (as mentioned in RSS specification) { foreach(explode(' ',$link['tags']) as $tag) { echo ''.$tag.''."\n"; } @@@ -832,9 -837,8 +812,9 @@@ function showATOM( { $link = $linksToDisplay[$keys[$i]]; $guid = $pageaddr.'?'.smallHash($link['linkdate']); - $iso8601date = linkdate2iso8601($link['linkdate']); - $latestDate = max($latestDate,$iso8601date); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $iso8601date = $date->format(DateTime::ISO8601); + $latestDate = max($latestDate, $iso8601date); $absurl = $link['url']; if (startsWith($absurl,'?')) $absurl=$pageaddr.$absurl; // make permalink URL absolute $entries.=''.$link['title'].''; @@@ -842,10 -846,7 +822,10 @@@ $entries.=''.$guid.''; else $entries.=''.$guid.''; - if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) $entries.=''.escape($iso8601date).''; + + if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) { + $entries.=''.escape($iso8601date).''; + } // Add permalink in description $descriptionlink = '(Permalink)'; @@@ -951,7 -952,8 +931,7 @@@ function showDailyRSS() // For each day. foreach ($days as $day => $linkdates) { - $daydate = linkdate2timestamp($day.'_000000'); // Full text date - $rfc822date = linkdate2rfc822($day.'_000000'); + $dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day.'_000000'); $absurl = escape(index_url($_SERVER).'?do=daily&day='.$day); // Absolute URL of the corresponding "Daily" page. // Build the HTML body of this RSS entry. @@@ -964,8 -966,7 +944,8 @@@ $l = $LINKSDB[$linkdate]; $l['formatedDescription'] = format_description($l['description'], $GLOBALS['redirector']); $l['thumbnail'] = thumbnail($l['url']); - $l['timestamp'] = linkdate2timestamp($l['linkdate']); + $l_date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $l['linkdate']); + $l['timestamp'] = $l_date->getTimestamp(); if (startsWith($l['url'], '?')) { $l['url'] = index_url($_SERVER) . $l['url']; // make permalink URL absolute } @@@ -975,10 -976,10 +955,10 @@@ // Then build the HTML for this day: $tpl = new RainTPL; $tpl->assign('title', $GLOBALS['title']); - $tpl->assign('daydate', $daydate); + $tpl->assign('daydate', $dayDate->getTimestamp()); $tpl->assign('absurl', $absurl); $tpl->assign('links', $links); - $tpl->assign('rfc822date', escape($rfc822date)); + $tpl->assign('rssdate', escape($dayDate->format(DateTime::RSS))); $html = $tpl->draw('dailyrss', $return_string=true); echo $html . PHP_EOL; @@@ -1034,8 -1035,7 +1014,8 @@@ function showDaily($pageBuilder $linksToDisplay[$key]['taglist']=$taglist; $linksToDisplay[$key]['formatedDescription'] = format_description($link['description'], $GLOBALS['redirector']); $linksToDisplay[$key]['thumbnail'] = thumbnail($link['url']); - $linksToDisplay[$key]['timestamp'] = linkdate2timestamp($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $linksToDisplay[$key]['timestamp'] = $date->getTimestamp(); } /* We need to spread the articles on 3 columns. @@@ -1060,12 -1060,11 +1040,12 @@@ $fill[$index]+=$length; } + $dayDate = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $day.'_000000'); $data = array( 'linksToDisplay' => $linksToDisplay, 'linkcount' => count($LINKSDB), 'cols' => $columns, - 'day' => linkdate2timestamp($day.'_000000'), + 'day' => $dayDate->getTimestamp(), 'previousday' => $previousday, 'nextday' => $nextday, ); @@@ -1219,11 -1218,12 +1199,12 @@@ function renderPage( uksort($tags, function($a, $b) { // Collator is part of PHP intl. if (class_exists('Collator')) { - $c = new Collator(setlocale(LC_ALL, 0)); - return $c->compare($a, $b); - } else { - return strcasecmp($a, $b); + $c = new Collator(setlocale(LC_COLLATE, 0)); + if (!intl_is_failure(intl_get_error_code())) { + return $c->compare($a, $b); + } } + return strcasecmp($a, $b); }); $tagList=array(); @@@ -1569,7 -1569,7 +1550,7 @@@ $link = array( 'title' => trim($_POST['lf_title']), 'url' => $url, - 'description' => trim($_POST['lf_description']), + 'description' => $_POST['lf_description'], 'private' => (isset($_POST['lf_private']) ? 1 : 0), 'linkdate' => $linkdate, 'tags' => str_replace(',', ' ', $tags) @@@ -1780,8 -1780,7 +1761,8 @@@ HTML ($exportWhat=='private' && $link['private']!=0) || ($exportWhat=='public' && $link['private']==0)) { - echo '
'.$link['title']."\n"; if ($link['description']!='') echo '
'.$link['description']."\n"; @@@ -2024,8 -2023,7 +2005,8 @@@ function buildLinkList($PAGE,$LINKSDB $link['description'] = format_description($link['description'], $GLOBALS['redirector']); $classLi = ($i % 2) != 0 ? '' : 'publicLinkHightLight'; $link['class'] = $link['private'] == 0 ? $classLi : 'private'; - $link['timestamp'] = linkdate2timestamp($link['linkdate']); + $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']); + $link['timestamp'] = $date->getTimestamp(); $taglist = explode(' ', $link['tags']); uasort($taglist, 'strcasecmp'); $link['taglist'] = $taglist;