'; $item_tmpl = '
  • %3$s %1$s
  • '; foreach ($news as $item) { $html .= sprintf($item_tmpl, news_date($item['date'], $locale), $item['link'], $item['title'] ); } $html .= ''; return $html; } /** * @param string $dt date in the form ISO 8601 (2015-02-24T15:42:00+01:00) * @param string $locale * * @return string localised date */ function news_date($dt, $locale = 'en') { $eng_months = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); $localised_months = array(_r('Jan'), _r('Feb'), _r('Mar'), _r('Apr'), _r('May'), _r('Jun'), _r('Jul'), _r('Aug'), _r('Sep'), _r('Oct'), _r('Nov'), _r('Dec')); $date_format = _r('M d Y'); if ((strpbrk($date_format, 'dj') == false) // check valid day formats || (strpbrk($date_format, 'M') == false) // check valid month formats (all are 'FmMn' but we replace them in 3 letter form) || (strpbrk($date_format, 'oYy') == false)) // check valid year formats { $date_format = 'M d Y'; // fallback for invalid date format localisation } return str_replace($eng_months, $localised_months, date($date_format, strtotime($dt))); } /** * @param string $locale * @param integer $count * @param integer $cache_timeout * * @return array */ function get_news($locale = 'en', $count = 5, $cache_timeout = 5) { return get_feed(blog_link($locale), $count, cache_timeout); } /** */ function get_feed($url, $count = 5, $cache_timeout = 5) { include_once G_APP_ROOT . '/lib/simplepie/autoloader.php'; $feed = new SimplePie(); $feed->set_feed_url($url); $feed->set_cache_location(realpath(G_APP_ROOT . '/_nav/var/tmp/cache')); $feed->set_cache_duration(3600 * $cache_timeout); $feed->set_timeout(10); // second part of a #mga23215 bugfix $feed->force_cache_fallback(true); // this should help if rss files are not retrievable $feed->enable_order_by_date(true); $feed->init(); $feed->handle_content_type(); $items = array(); foreach ($feed->get_items(0, $count) as $item) { $items[] = array( 'source' => $item->get_feed()->get_link(), 'link' => $item->get_permalink(), 'title' => $item->get_title(), 'date' => $item->get_date('c'), 'desc' => $item->get_description(), 'author' => $item->get_author() ); } unset($feed); return $items; } /** * * @param string $locale locale this feed is expected to be in * @param string $news_title feed title * @param string $link feed main site title * @param string $feed feed url * @param integer $count how many items to return * @param string $skip url whose element we want to skip (why?) * @param boolean split title that has been built by aggregator * @param string $discrete_title more discrete title * @param array $data if get_feed() is called outside, it's result is passed * * @return string */ function show_feed($locale, $news_title, $link, $feed, $count = 5, $skip = null, $split = false, $discrete_title = null, $data = null) { if (!is_null($skip)) $count += 5; if(is_null($data)) { $data = get_feed($feed, $count); if(0 == count($data)) { $feed = rtrim($feed, '10'); // cut 10 as a fallback (type=rss) $data = get_feed($feed, $count); } if(0 == count($data)) { $feed = $feed .'10'; // add 10 as a fallback (type=rss10) $data = get_feed($feed, $count); } } if(0 == count($data)) { return; } $s = ''; $header = ''; $source = null; $date_separator = (is_null($discrete_title) ? null : '| '); $s .= ''; if (is_null($date_separator)) { $header = sprintf('

    %s

    ', $link, $news_title); } $s = $header . $s; echo $s; } /** * @param string $eng_planet_url = 'https://planet.mageia.org/en/' * @param string $eng_blog_url = 'https://blog.mageia.org/en/' * @param string $loc_planet_url = _r_('https://planet.mageia.org/en/') * @param string $loc_blog_url = _r_('https://blog.mageia.org/en/') * @param integer $req_quantity number or requested planet/blog titles * @param integer $min_num_of_loc_post minimum number of localised posts to return without adding English ones * * @return array ($loc_posts_title for show_feed() function, $fresh_loc_posts, $num_fresh_loc_posts, $eng_posts_title for show_feed() function, $fresh_eng_posts, $first_source) * * $first_source: 0 = none, 1 = localized planet, 2 = localized blog, 3 = English planet, 4 = English blog */ function prepare_fresh_blog_post_titles($eng_planet_url, $eng_blog_url, $loc_planet_url, $loc_blog_url, $req_quantity = 9, $min_num_of_loc_post = 4) { $max_posts_age_days = 90; $posts_age_limit = time()-($max_posts_age_days * 24*60*60); $fresh_loc_posts = array(); $fresh_eng_posts = array(); $loc_posts_title = ''; $eng_posts_title = ''; $first_source = 0; // prepare fresh enough localised planet posts if they exist if ($eng_planet_url != $loc_planet_url) { $loc_planet_posts = get_feed($loc_planet_url . '?type=rss10', $req_quantity); if (count($loc_planet_posts) > 0) { $loc_posts_title = _r('Planet'); $first_source = 1; foreach ($loc_planet_posts as $planet_post) { if ($posts_age_limit < strtotime($planet_post["date"])) { $planet_post["desc"] = ''; // not needed (conserving memory) $fresh_loc_posts[] = $planet_post; } } } } // prepare fresh enough localised blog posts if there's no localised planet if(0 == count($fresh_loc_posts) && $eng_blog_url != $loc_blog_url) { $loc_blog_posts = get_feed($loc_blog_url . '?type=rss10', $req_quantity); if (count($loc_blog_posts) > 0) { $loc_posts_title = _r('Blog'); $first_source = 2; foreach ($loc_blog_posts as $blog_post) { if ($posts_age_limit < strtotime($blog_post["date"])) { $blog_post["desc"] = ''; // not needed $fresh_loc_posts[] = $blog_post; } } } } // prepare fresh enough English planet posts if there's only a few or no localised posts $num_fresh_loc_posts = count($fresh_loc_posts); if ($min_num_of_loc_post > $num_fresh_loc_posts) { if (0 < $num_fresh_loc_posts) { $req_quantity = $req_quantity - $num_fresh_loc_posts - 1; } $eng_planet_posts = get_feed($eng_planet_url . '?type=rss10', $req_quantity); if (count($eng_planet_posts) > 0) { $eng_posts_title = _r('Planet'); $first_source = 3; foreach ($eng_planet_posts as $planet_post) { if ($posts_age_limit < strtotime($planet_post["date"])) { $planet_post["desc"] = ''; // not needed $fresh_eng_posts[] = $planet_post; } } } // prepare fresh enough English blog posts if there's no English planet posts if (0 == count($fresh_eng_posts)) { $eng_blog_posts = get_feed($eng_blog_url . '?type=rss10', $req_quantity); if (count($eng_blog_posts) > 1) { $eng_posts_title = _r('Blog'); $first_source = 4; foreach ($eng_blog_posts as $blog_post) { if ($posts_age_limit < strtotime($blog_post["date"])) { $blog_post["desc"] = ''; // not needed $fresh_eng_posts[] = $blog_post; } } } } } return array($loc_posts_title, $fresh_loc_posts, $num_fresh_loc_posts, $eng_posts_title, $fresh_eng_posts, $first_source); } /** */ function blog_link($locale) { $news = array( 'en' => 'https://blog.mageia.org/en/', 'de' => 'https://blog.mageia.org/de/', 'el' => 'https://blog.mageia.org/el/', 'es' => 'https://blog.mageia.org/es/', 'fr' => 'https://blog.mageia.org/fr/', 'de' => 'https://blog.mageia.org/de/', 'it' => 'https://blog.mageia.org/it/', 'nl' => 'https://blog.mageia.org/nl/', 'pl' => 'https://blog.mageia.org/pl/', 'pt' => 'https://blog.mageia.org/pt/', 'pt-br'=>'https://blog.mageia.org/pt/', 'ro' => 'https://blog.mageia.org/ro/', 'ru' => 'https://blog.mageia.org/ru/', 'sv' => 'https://blog.mageia.org/sv/', 'tr' => 'https://blog.mageia.org/tr/', 'uk' => 'https://blog.mageia.org/uk/', /* missing: et, fi, lv, nb, sl, zh-cn, zh-tw */ ); if (!array_key_exists($locale, $news)) $locale = 'en'; $source_url = $news[$locale]; return $source_url; } function planet_link($locale) { $planets = array( 'en', 'de', 'es', 'fr', 'it', 'pl', 'pt', 'pt-br'); $locale = in_array($locale, $planets) ? $locale : 'en'; return sprintf('https://planet.mageia.org/%s/', $locale); }