[44] | 1 | <?php
|
---|
| 2 | /*
|
---|
| 3 | Plugin Name: Feeder
|
---|
| 4 | Plugin URI: http://xubz.com/weblog/2007/03/feeder-wordpress-plugin
|
---|
| 5 | Description: RSS 2.0 Feed Reader with 'Feed-Cache' Function. Parses the Given Feed into Links for Display in Blogs, Read the Documentation for more Info.
|
---|
| 6 | Author: Subbu
|
---|
| 7 | Author URI: http://xubz.com/
|
---|
| 8 | Version: 0.3
|
---|
| 9 | License: GNU General Public License (v2 or Later)
|
---|
| 10 | */
|
---|
| 11 |
|
---|
| 12 | if ('feeder.php' == basename($_SERVER['SCRIPT_FILENAME']))
|
---|
| 13 | die ('Please do not load this directly');
|
---|
| 14 |
|
---|
| 15 | class feeder
|
---|
| 16 | {
|
---|
| 17 | var $feeder_ver = 0.30;
|
---|
| 18 |
|
---|
| 19 | function readFeed($filename, $xml_key="") //XML Parser, Most Part of it comes from PHP Manual (duh!)
|
---|
| 20 | {
|
---|
| 21 | $data = implode("", file($filename));
|
---|
| 22 | $parser = xml_parser_create();
|
---|
| 23 | $xml_key = ($xml_key == "") ? "item" : $xml_key;
|
---|
| 24 |
|
---|
| 25 | xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
|
---|
| 26 | xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
|
---|
| 27 | xml_parse_into_struct($parser, $data, $values, $tags);
|
---|
| 28 | xml_parser_free($parser);
|
---|
| 29 |
|
---|
| 30 | foreach ($tags as $key => $val)
|
---|
| 31 | {
|
---|
| 32 | if ($key == $xml_key)
|
---|
| 33 | {
|
---|
| 34 | $feedranges = $val;
|
---|
| 35 | for ($i = 0; $i < count($feedranges); $i += 2)
|
---|
| 36 | {
|
---|
| 37 | $offset = $feedranges[$i] + 1;
|
---|
| 38 | $len = $feedranges[$i + 1] - $offset;
|
---|
| 39 | $fdb[] = $this->parseFeed(array_slice($values, $offset, $len));
|
---|
| 40 | }
|
---|
| 41 | }
|
---|
| 42 | else
|
---|
| 43 | {
|
---|
| 44 | continue;
|
---|
| 45 | }
|
---|
| 46 | }
|
---|
| 47 | return $fdb;
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | function parseFeed($values)
|
---|
| 51 | {
|
---|
| 52 | for ($i = 0; $i < 2; $i++)
|
---|
| 53 | {
|
---|
| 54 | $feed[$values[$i]["tag"]] = $values[$i]["value"];
|
---|
| 55 | }
|
---|
| 56 | return $feed;
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | function clean_title($title) //Clean the Titles of some unexpected characters.. Donno why those Appear :-/
|
---|
| 60 | {
|
---|
| 61 | $title = trim($title);
|
---|
| 62 | $title = stripslashes($title);
|
---|
| 63 | $title = str_replace("ââ¬â¢", "'", $title);
|
---|
| 64 | $title = str_replace("ââ¬", """, $title);
|
---|
| 65 | $title = str_replace("Å", "", $title);
|
---|
| 66 | $title = htmlspecialchars($title);
|
---|
| 67 | return $title;
|
---|
| 68 | }
|
---|
| 69 |
|
---|
| 70 | function process_data($feed_array)
|
---|
| 71 | {
|
---|
| 72 | $linkcount = 0;
|
---|
| 73 | $linksshown = 1;
|
---|
| 74 | $processed = array();
|
---|
| 75 |
|
---|
| 76 | foreach($feed_array as $array)
|
---|
| 77 | {
|
---|
| 78 | $link = $array['link'];
|
---|
| 79 | $title = $this->clean_title($array['title']);
|
---|
| 80 |
|
---|
| 81 | $tooltip = $title;
|
---|
| 82 | $title = substr($title, 0, $this->numchars); //Limit the Number of Characters to be Shown in Title
|
---|
| 83 | $title = (strlen($title) >= $this->numchars) ? ($title . $this->prefix) : $title;
|
---|
| 84 |
|
---|
| 85 | $processed[$linkcount] = sprintf("\t%s<a href=\"%s\" title=\"%s\" class=\"%s\" target=\"%s\">%s</a>%s\n", $this->tag1, $link, $tooltip, $this->link_class, $this->link_target, $title, $this->tag2);
|
---|
| 86 | $linkcount = $linkcount + 1;
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | foreach ($processed as $show_link)
|
---|
| 90 | {
|
---|
| 91 | if ($linksshown <= $this->numlinks)
|
---|
| 92 | {
|
---|
| 93 | echo $show_link;
|
---|
| 94 | $linksshown = $linksshown + 1;
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | return ($linksshown - 1);
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | function feeder($filename = "", $numlinks = 0, $tag1 = "", $tag2 = "", $link_class = "", $link_target = "", $numchars = 0, $cache = 0, $update_time = 0) //Class Constructor
|
---|
| 102 | {
|
---|
| 103 | if ($filename != "") //Check if the given Feed Path is Empty
|
---|
| 104 | {
|
---|
| 105 | error_reporting(0);
|
---|
| 106 | $filep = fopen($filename, "r"); //Try to open it.. Throws a insane amount of errors if the server can't,
|
---|
| 107 | //So Disable the Error Reporting for a While :-/ (Have a better Method??)
|
---|
| 108 |
|
---|
| 109 | error_reporting(E_ALL & ~E_NOTICE);
|
---|
| 110 |
|
---|
| 111 | //Assign the basic variables
|
---|
| 112 | $cached = false;
|
---|
| 113 | $feed_file;
|
---|
| 114 |
|
---|
| 115 | $upload_path = ABSPATH . 'wp-content/uploads/';
|
---|
| 116 | if (!is_dir($upload_path)) { echo "\n<li><a href=\"#\" title=\"Please Create a Uploads Directory in /wp-content/\">Feeder: Upload Dir. Doesn't Exist</a></li>"; }
|
---|
| 117 |
|
---|
| 118 | $cache_path = $upload_path . 'feeder_' . substr(md5($filename), 0, 8) . '.xml'; //Prefix a Random String Made from the Filename
|
---|
| 119 |
|
---|
| 120 | if ($filep) //Check if the Feed is Readable, See Line 106..
|
---|
| 121 | {
|
---|
| 122 | //Validate all the Function Variables and set Default Values
|
---|
| 123 | $this->prefix = "...";
|
---|
| 124 | $this->tag1 = ($tag1 == "") ? "<li>" : $tag1;
|
---|
| 125 | $this->tag2 = ($tag2 == "") ? "</li>" : $tag2;
|
---|
| 126 | $this->numchars = ($numchars == 0 or !is_integer($numchars) or $numchars < 1) ? 32 : $numchars;
|
---|
| 127 | $this->numlinks = ($numlinks == 0 or !is_integer($numlinks) or $numlinks < 1) ? 10 : $numlinks;
|
---|
| 128 | $this->link_class = ($link_class == "") ? "feeder-link" : $link_class;
|
---|
| 129 | $this->link_target = ($link_target == "" or ($link_target != "_self" and $link_target != "_blank")) ? "_self" : $link_target;
|
---|
| 130 | $update_time = ($update_time == 0 or !is_integer($update_time) or $update_time < 60) ? 3600 : $update_time;
|
---|
| 131 | $cache = ($cache == 1) ? 1 : 0;
|
---|
| 132 |
|
---|
| 133 | if ($cache == 1) //If Cache is Enabled
|
---|
| 134 | {
|
---|
| 135 | $feed_file = $cache_path;
|
---|
| 136 |
|
---|
| 137 | if (file_exists($cache_path)) //If the Feed was already Cached
|
---|
| 138 | {
|
---|
| 139 | //Get the Cache and Current Time (UNIX_TIMESTAMP)
|
---|
| 140 | $file_timestamp = filemtime($cache_path);
|
---|
| 141 | $current_timestamp = time();
|
---|
| 142 | $time_difference = $current_timestamp - $file_timestamp;
|
---|
| 143 |
|
---|
| 144 | if ($time_difference >= $update_time) //Check whether the cache is deprecated (a simple validation Uh?)
|
---|
| 145 | {
|
---|
| 146 | $cached = false; //Its Deprecated, so set Cached as False
|
---|
| 147 | }
|
---|
| 148 | else
|
---|
| 149 | {
|
---|
| 150 | $cached = true; //Quite New, No Need to Update the Cache
|
---|
| 151 | }
|
---|
| 152 | }
|
---|
| 153 | else //Cache Doesn't Exist, Create it..
|
---|
| 154 | {
|
---|
| 155 | $cached = false;
|
---|
| 156 | }
|
---|
| 157 |
|
---|
| 158 | if (!$cached) //The file is NOT Cached, so Create it.
|
---|
| 159 | {
|
---|
| 160 | if (file_exists($cache_path)) { unlink($cache_path); } //Unlink the old Cache to Update it.
|
---|
| 161 |
|
---|
| 162 | $feeder_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">\r"; //Start Creating the Cache Content
|
---|
| 163 | $feeder_xml .= "<!-- generator=\"Feeder " . $this->feeder_ver . "\" -->\r";
|
---|
| 164 | $feeder_xml .= "<feeder>\r";
|
---|
| 165 |
|
---|
| 166 | $feed_array = $this->readFeed($filename, "item"); //Parse the Feed into the Cache
|
---|
| 167 | if ($feed_array != "")
|
---|
| 168 | {
|
---|
| 169 | foreach ($feed_array as $array) //Add XML Elements
|
---|
| 170 | {
|
---|
| 171 | $link = $array['link'];
|
---|
| 172 | $title = $this->clean_title($array['title']);
|
---|
| 173 | $feeder_xml .= sprintf("<url>\n\t<title>%s</title>\n\t<link>%s</link>\n</url>\r", $title, $link);
|
---|
| 174 | }
|
---|
| 175 | }
|
---|
| 176 | else //Could not parse the feed, So Display a Error
|
---|
| 177 | {
|
---|
| 178 | echo "\n<li><a href=\"#\" title=\"The Resource provided does not seem to be a Valid RSS 2.0 Feed\">Feeder: Resource NOT a Feed</a></li>";
|
---|
| 179 | $bad_feed = 1;
|
---|
| 180 | }
|
---|
| 181 |
|
---|
| 182 | $feeder_xml .= "</feeder>";
|
---|
| 183 |
|
---|
| 184 | if (!isset($bad_feed) and $bad_feed != 1) //If There was no error, Continue
|
---|
| 185 | {
|
---|
| 186 | error_reporting(0); //If only PHP(5) had a better working try-catch Method.. :-/
|
---|
| 187 | if ($cachep = fopen($cache_path, "w")) //Write the Cache to the File
|
---|
| 188 | {
|
---|
| 189 | fputs($cachep, $feeder_xml);
|
---|
| 190 | fclose($cachep);
|
---|
| 191 | echo "\t<!-- Feeder: Cache Updated/Created.. Next Update on " . date("r", time() + $update_time) . " -->";
|
---|
| 192 | $cached = true;
|
---|
| 193 | }
|
---|
| 194 | else //Could not Write, Display Error, Set Cached as False
|
---|
| 195 | {
|
---|
| 196 | echo "\n<li><a href=\"#\" title=\"Could not Write/Read Cache, Please make sure uploads folder is set to CHMOD 777\">Feeder: Cache Permission Denied</a></li>";
|
---|
| 197 | $cached = false;
|
---|
| 198 | }
|
---|
| 199 | error_reporting(E_ALL & ~E_NOTICE);
|
---|
| 200 | }
|
---|
| 201 | else //Error in the Given Feed, Set Cached as False
|
---|
| 202 | {
|
---|
| 203 | $cached = false;
|
---|
| 204 | }
|
---|
| 205 | }
|
---|
| 206 | }
|
---|
| 207 |
|
---|
| 208 | if ($cached) //Check if Cached is True, Parse the Links from the Cache
|
---|
| 209 | {
|
---|
| 210 | $feed_array = $this->readFeed($feed_file, "url");
|
---|
| 211 | if ($feed_array != "")
|
---|
| 212 | {
|
---|
| 213 | $links_shown = $this->process_data($feed_array);
|
---|
| 214 | echo "\t<!-- Feeder: " . $links_shown . " links parsed from Cache -->";
|
---|
| 215 | }
|
---|
| 216 | else //No Data in Cache, set Cached as False and Continue
|
---|
| 217 | {
|
---|
| 218 | $cached = false;
|
---|
| 219 | }
|
---|
| 220 | }
|
---|
| 221 |
|
---|
| 222 | if ($cache != 1 or !$cached) //Cache is Disabled and Cached is False
|
---|
| 223 | {
|
---|
| 224 | if (file_exists($cache_path)) { unlink($cache_path); } //Delete the Cache, Create it later (Failproof Method)
|
---|
| 225 |
|
---|
| 226 | $feed_array = $this->readFeed($filename, "item");
|
---|
| 227 | if ($feed_array != "")
|
---|
| 228 | {
|
---|
| 229 | $links_shown = $this->process_data($feed_array);
|
---|
| 230 | echo "\t<!-- Feeder: " . $links_shown . " links parsed directly from Feed -->";
|
---|
| 231 | }
|
---|
| 232 | else //Throw some Errors....
|
---|
| 233 | {
|
---|
| 234 | echo "\n<li><a href=\"#\" title=\"The Resource provided does not seem to be a Valid RSS 2.0 Feed\">Feeder: Resource NOT a Feed</a></li>";
|
---|
| 235 | }
|
---|
| 236 | }
|
---|
| 237 | }
|
---|
| 238 | else
|
---|
| 239 | {
|
---|
| 240 | echo "\n<li><a href=\"#\" title=\"Host Seems to be Down/Feed Doesn't Exist\">Feeder: (404) Feed not Found</a></li>";
|
---|
| 241 | }
|
---|
| 242 | }
|
---|
| 243 | else
|
---|
| 244 | {
|
---|
| 245 | echo "\n<li><a href=\"#\">Feeder: No URL Provided</a></li>";
|
---|
| 246 | }
|
---|
| 247 | }
|
---|
| 248 | }
|
---|
| 249 | //Thats all folks!
|
---|
| 250 | ?>
|
---|