summaryrefslogtreecommitdiffstats
path: root/common/app/classes
diff options
context:
space:
mode:
Diffstat (limited to 'common/app/classes')
-rw-r--r--common/app/classes/Planet.class.php155
-rw-r--r--common/app/classes/PlanetConfig.php88
-rw-r--r--common/app/classes/PlanetError.php23
-rw-r--r--common/app/classes/PlanetFeed.php46
-rw-r--r--common/app/classes/PlanetItem.php27
-rwxr-xr-xcommon/app/classes/Simplel10n.class.php52
6 files changed, 391 insertions, 0 deletions
diff --git a/common/app/classes/Planet.class.php b/common/app/classes/Planet.class.php
new file mode 100644
index 0000000..4dcfbba
--- /dev/null
+++ b/common/app/classes/Planet.class.php
@@ -0,0 +1,155 @@
+<?php
+/*
+Copyright (c) 2006, Maurice Svay
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+* Neither the name of Maurice Svay nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/**
+ * Planet, main app class
+ */
+class Planet
+{
+ public $config;
+ public $items;
+ public $people;
+ public $errors;
+
+ public function __construct($config=null)
+ {
+
+ if ($config == null) {
+ $this->config = new PlanetConfig(array());
+ } else {
+ $this->config = $config;
+ }
+
+ $this->items = array();
+ $this->people = array();
+ $this->errors = array();
+ }
+
+ /**
+ * Getters
+ */
+ public function getItems()
+ {
+ return $this->items;
+ }
+
+ public function getPeople()
+ {
+ return $this->people;
+ }
+
+ /**
+ * Adds a feed to the planet
+ * @param PlanetFeed feed
+ */
+ public function addPerson(&$feed)
+ {
+ $this->people[] = $feed;
+ }
+
+ /**
+ * Load people from an OPML
+ * @return integer Number of people loaded
+ */
+ public function loadOpml($file)
+ {
+ if (!is_file($file)) {
+ $this->errors[] = new PlanetError(3, $file.' is missing.');
+ return 0;
+ }
+
+ $opml = OpmlManager::load($file);
+ $opml_people = $opml->getPeople();
+ foreach ($opml_people as $opml_person){
+ $this->addPerson(
+ new PlanetFeed(
+ $opml_person['name'],
+ $opml_person['feed'],
+ $opml_person['website']
+ )
+ );
+ }
+ return count($opml_people);
+ }
+
+ /**
+ * Load feeds
+ */
+ public function loadFeeds()
+ {
+ foreach ($this->people as $feed) {
+ $feed->set_timeout(-1);
+ $feed->init();
+ $this->items = array_merge($this->items, $feed->get_items());
+ }
+
+ $this->sort();
+ }
+
+ /**
+ * Download
+ * @var $max_load percentage of feeds to load
+ */
+ public function download($max_load=0.1)
+ {
+
+ $max_load_feeds = ceil(count($this->people) * $max_load);
+
+ foreach ($this->people as $feed) {
+ //Avoid mass loading with variable cache duration
+ //$feed->set_cache_duration($this->config->getCacheTimeout()+rand(0,30));
+ $feed->set_cache_duration($this->config->getCacheTimeout());
+
+ //Load only a few feeds, force other to fetch from the cache
+ if (0 > $max_load_feeds--) {
+ $feed->set_timeout(-1);
+ $this->errors[] = new PlanetError(1, 'Forced from cache : '.$feed->getFeed());
+ }
+
+ //Load feed
+ $feed->init();
+
+ // http://simplepie.org/wiki/reference/simplepie/merge_items ?
+ //Add items to index
+ if (($feed->data) && ($feed->get_item_quantity() > 0)){
+ $items = $feed->get_items();
+ $this->items = array_merge($this->items, $items);
+ } else {
+ $this->errors[] = new PlanetError(1, 'No items : '.$feed->getFeed());
+ }
+ }
+ }
+
+ public function sort()
+ {
+ usort($this->items, array('PlanetItem','compare'));
+ }
+}
diff --git a/common/app/classes/PlanetConfig.php b/common/app/classes/PlanetConfig.php
new file mode 100644
index 0000000..a31938e
--- /dev/null
+++ b/common/app/classes/PlanetConfig.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * Planet configuration class
+ */
+class PlanetConfig
+{
+
+ public $conf;
+
+ public function __construct($array)
+ {
+ $defaultConfig = array(
+ 'url' => 'http://www.example.com/',
+ 'name' => '',
+ 'locale' => 'en',
+ 'items' => 10,
+ 'shuffle' => 0,
+ 'refresh' => 240,
+ 'cache' => 10,
+ 'nohtml' => 0,
+ 'postmaxlength' => 0,
+ 'cachedir' => './cache',
+ );
+
+ // User config
+ $this->conf = $array;
+
+ // Complete config with default config
+ foreach ($defaultConfig as $key => $value) {
+ if (!isset($this->conf[$key])) {
+ $this->conf[$key] = $value;
+ }
+ }
+ }
+
+ public function getUrl()
+ {
+ return $this->conf['url'];
+ }
+
+ public function getName(){
+ return $this->conf['name'];
+ }
+
+ public function setName($name)
+ {
+ $this->conf['name'] = $name;
+ }
+
+ public function getCacheTimeout()
+ {
+ return $this->conf['refresh'];
+ }
+
+ public function getOutputTimeout()
+ {
+ return $this->conf['cache'];
+ }
+
+ //@TODO: drop this pref
+ public function getShuffle()
+ {
+ return $this->conf['shuffle'];
+ }
+
+ public function getMaxDisplay()
+ {
+ return $this->conf['items'];
+ }
+
+ //@TODO: drop this pref
+ public function getNoHTML()
+ {
+ return $this->conf['nohtml'];
+ }
+
+ //@TODO: drop this pref
+ public function getPostMaxLength()
+ {
+ return $this->conf['postmaxlength'];
+ }
+
+ public function toYaml()
+ {
+ return Spyc::YAMLDump($this->conf,4);
+ }
+}
diff --git a/common/app/classes/PlanetError.php b/common/app/classes/PlanetError.php
new file mode 100644
index 0000000..31923a3
--- /dev/null
+++ b/common/app/classes/PlanetError.php
@@ -0,0 +1,23 @@
+<?php
+
+class PlanetError
+{
+ public $level;
+ public $message;
+
+ public function __construct($level, $message)
+ {
+ $this->level = (int) $level;
+ $this->message = $message;
+ }
+
+ public function toString($format = '%1$s : %2$s')
+ {
+ $levels = array(
+ 1 => 'notice',
+ 2 => 'warning',
+ 3 => 'error',
+ );
+ return sprintf($format, $levels[$this->level], $this->message);
+ }
+}
diff --git a/common/app/classes/PlanetFeed.php b/common/app/classes/PlanetFeed.php
new file mode 100644
index 0000000..a6c7aab
--- /dev/null
+++ b/common/app/classes/PlanetFeed.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Planet person
+ */
+
+class PlanetFeed extends SimplePie
+{
+ public $name;
+ public $feed;
+ public $website;
+
+ public function __construct($name, $feed, $website)
+ {
+ $this->name = $name;
+ $this->feed = $feed;
+ $this->website = $website;
+ parent::__construct();
+ $this->set_item_class('PlanetItem');
+ $this->set_cache_location(dirname(__FILE__).'/../../cache');
+ $this->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE);
+ $this->set_feed_url($this->getFeed());
+ $this->set_timeout(5);
+ $this->set_stupidly_fast(true);
+ }
+
+ public function getFeed()
+ {
+ return $this->feed;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function getWebsite()
+ {
+ return $this->website;
+ }
+
+ public function compare($person1, $person2)
+ {
+ return strcasecmp($person1->name, $person2->name);
+ }
+}
diff --git a/common/app/classes/PlanetItem.php b/common/app/classes/PlanetItem.php
new file mode 100644
index 0000000..039d0ca
--- /dev/null
+++ b/common/app/classes/PlanetItem.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Planet item
+ */
+
+class PlanetItem
+{
+ public function __construct($feed, $data)
+ {
+ parent::SimplePie_Item($feed, $data);
+ }
+
+ public function compare($item1, $item2)
+ {
+ $item1_date = $item1->get_date('U');
+ $item2_date = $item2->get_date('U');
+
+ if ($item1_date == $item2_date) {
+ return 0;
+ } elseif ($item1_date < $item2_date) {
+ return 1;
+ }
+
+ return -1;
+ }
+}
diff --git a/common/app/classes/Simplel10n.class.php b/common/app/classes/Simplel10n.class.php
new file mode 100755
index 0000000..7af8564
--- /dev/null
+++ b/common/app/classes/Simplel10n.class.php
@@ -0,0 +1,52 @@
+<?php
+
+
+class Simplel10n {
+
+ public $locale;
+ public $l10nFolder;
+
+ public function __construct($locale='en') {
+ $GLOBALS['locale'] = array();
+ $this->locale = $locale;
+ $this->l10nFolder = dirname(__FILE__) . '/../l10n/';
+ $this->load($this->l10nFolder . $this->locale);
+ }
+
+ public function setL1OnFolder($path) {
+ $this->l10nFolder = $path;
+ }
+
+ static function getString($str, $comment='') {
+ if(array_key_exists($str, $GLOBALS['locale'])) {
+ return trim(str_replace('{ok}', '', $GLOBALS['locale'][$str]));
+ } else {
+ return $str;
+ }
+ }
+
+ /*
+ * This is the same as getString except that we don't remove the {ok} string
+ * This is needed only for the extraction script
+ */
+ static function extractString($str, $comment='') {
+ if(array_key_exists($str, $GLOBALS['locale'])) {
+ return $GLOBALS['locale'][$str];
+ } else {
+ return $str;
+ }
+ }
+
+ static function load($pathToFile) {
+
+ if (!file_exists($pathToFile . '.lang')) return false;
+
+ $file = file($pathToFile . '.lang');
+
+ foreach ($file as $k => $v) {
+ if (substr($v,0,1) == ';' && !empty($file[$k+1])) {
+ $GLOBALS['locale'][trim(substr($v,1))] = trim($file[$k+1]);
+ }
+ }
+ }
+}