]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Merge pull request #492 from ArthurHoaro/locale-sort-fix
authorArthur <arthur@hoa.ro>
Wed, 24 Feb 2016 18:26:57 +0000 (19:26 +0100)
committerArthur <arthur@hoa.ro>
Wed, 24 Feb 2016 18:26:57 +0000 (19:26 +0100)
Fixes #481: tag cloud fatal error

1  2 
index.php

diff --combined index.php
index 5bd9cac4e39e15df6e4901b35a4929da7f316616,231b63f65bc5df8470aaeb79fe6b1864649a2a68..a9264cbb9f7d99db16477fc4d4cf14afad4dbff0
+++ 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 '<item><title>'.$link['title'].'</title><guid isPermaLink="true">'.$guid.'</guid><link>'.$guid.'</link>';
          else
              echo '<item><title>'.$link['title'].'</title><guid isPermaLink="false">'.$guid.'</guid><link>'.$absurl.'</link>';
 -        if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) echo '<pubDate>'.escape($rfc822date)."</pubDate>\n";
 +        if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) {
 +            echo '<pubDate>'.escape($date->format(DateTime::RSS))."</pubDate>\n";
 +        }
          if ($link['tags']!='') // Adding tags to each RSS entry (as mentioned in RSS specification)
          {
              foreach(explode(' ',$link['tags']) as $tag) { echo '<category domain="'.$pageaddr.'">'.$tag.'</category>'."\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.='<entry><title>'.$link['title'].'</title>';
              $entries.='<link href="'.$guid.'" /><id>'.$guid.'</id>';
          else
              $entries.='<link href="'.$absurl.'" /><id>'.$guid.'</id>';
 -        if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) $entries.='<updated>'.escape($iso8601date).'</updated>';
 +
 +        if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) {
 +            $entries.='<updated>'.escape($iso8601date).'</updated>';
 +        }
  
          // Add permalink in description
          $descriptionlink = '(<a href="'.$guid.'">Permalink</a>)';
@@@ -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.
              $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
              }
          // 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.
          $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();
          $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 '<DT><A HREF="'.$link['url'].'" ADD_DATE="'.linkdate2timestamp($link['linkdate']).'" PRIVATE="'.$link['private'].'"';
 +                $date = DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, $link['linkdate']);
 +                echo '<DT><A HREF="'.$link['url'].'" ADD_DATE="'.$date->getTimestamp().'" PRIVATE="'.$link['private'].'"';
                  if ($link['tags']!='') echo ' TAGS="'.str_replace(' ',',',$link['tags']).'"';
                  echo '>'.$link['title']."</A>\n";
                  if ($link['description']!='') echo '<DD>'.$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;