maintainer = 'ORelio'; $this->name = 'ZDNet Bridge'; $this->uri = 'http://www.zdnet.com/'; $this->description = 'Technology News, Analysis, Comments and Product Reviews for IT Professionals.'; $this->parameters[] = // http://www.zdnet.com/zdnet.opml '[ { "name" : "Feed", "type" : "list", "identifier" : "feed", "values" : [ { "name" : "---- Select ----", "value" : "" }, { "name" : "", "value" : "" }, { "name" : "Subscribe to ZDNet RSS Feeds", "value" : "" }, { "name" : "    All Blogs", "value" : "blog" }, { "name" : "    Just News", "value" : "news" }, { "name" : "    All Reviews", "value" : "topic/reviews" }, { "name" : "    Latest Downloads", "value" : "downloads!recent" }, { "name" : "    Latest Articles", "value" : "/" }, { "name" : "    Latest Australia Articles", "value" : "au" }, { "name" : "    Latest UK Articles", "value" : "uk" }, { "name" : "    Latest US Articles", "value" : "us" }, { "name" : "    Latest Asia Articles", "value" : "as" }, { "name" : "", "value" : "" }, { "name" : "Keep up with ZDNet Blogs RSS:", "value" : "" }, { "name" : "    Transforming the Datacenter", "value" : "blog/transforming-datacenter" }, { "name" : "    SMB India", "value" : "blog/smb-india" }, { "name" : "    Indonesia BizTech", "value" : "blog/indonesia-biztech" }, { "name" : "    Hong Kong Techie", "value" : "blog/hong-kong-techie" }, { "name" : "    Tech Taiwan", "value" : "blog/tech-taiwan" }, { "name" : "    Startup India", "value" : "blog/startup-india" }, { "name" : "    Starting Up Asia", "value" : "blog/starting-up-asia" }, { "name" : "    Next-Gen Partner", "value" : "blog/partner" }, { "name" : "    Post-PC Developments", "value" : "blog/post-pc" }, { "name" : "    Benelux", "value" : "blog/benelux" }, { "name" : "    Heat Sink", "value" : "blog/heat-sink" }, { "name" : "    Italy's got tech", "value" : "blog/italy" }, { "name" : "    African Enterprise", "value" : "blog/african-enterprise" }, { "name" : "    New Tech for Old India", "value" : "blog/new-india" }, { "name" : "    Estonia Uncovered", "value" : "blog/estonia" }, { "name" : "    IT Iberia", "value" : "blog/iberia" }, { "name" : "    Brazil Tech", "value" : "blog/brazil" }, { "name" : "    500 words into the future", "value" : "blog/500-words-into-the-future" }, { "name" : "    ÜberTech", "value" : "blog/ubertech" }, { "name" : "    All About Microsoft", "value" : "blog/microsoft" }, { "name" : "    Back office", "value" : "blog/back-office" }, { "name" : "    Barker Bites Back", "value" : "blog/barker-bites-back" }, { "name" : "    Between the Lines", "value" : "blog/btl" }, { "name" : "    Big on Data", "value" : "blog/big-data" }, { "name" : "    bootstrappr", "value" : "blog/bootstrappr" }, { "name" : "    By The Way", "value" : "blog/by-the-way" }, { "name" : "    Central European Processing", "value" : "blog/central-europe" }, { "name" : "    Cloud Builders", "value" : "blog/cloud-builders" }, { "name" : "    Communication Breakdown", "value" : "blog/communication-breakdown" }, { "name" : "    Collaboration 2.0", "value" : "blog/collaboration" }, { "name" : "    Constellation Research", "value" : "blog/constellation" }, { "name" : "    Consumerization: BYOD", "value" : "blog/consumerization" }, { "name" : "    DIY-IT", "value" : "blog/diy-it" }, { "name" : "    Enterprise Web 2.0", "value" : "blog/hinchcliffe" }, { "name" : "    Five Nines: The Next Gen Datacenter", "value" : "blog/datacenter" }, { "name" : "    Forrester Research", "value" : "blog/forrester" }, { "name" : "    Full Duplex", "value" : "blog/full-duplex" }, { "name" : "    Gen Why?", "value" : "blog/gen-why" }, { "name" : "    Hardware 2.0", "value" : "blog/hardware" }, { "name" : "    Identity Matters", "value" : "blog/identity" }, { "name" : "    iGeneration", "value" : "blog/igeneration" }, { "name" : "    Internet of Everything", "value" : "blog/cisco" }, { "name" : "    Beyond IT Failure", "value" : "blog/projectfailures" }, { "name" : "    Jamie's Mostly Linux Stuff", "value" : "blog/jamies-mostly-linux-stuff" }, { "name" : "    Jack's Blog", "value" : "blog/jacks-blog" }, { "name" : "    Laptops & Desktops", "value" : "blog/computers" }, { "name" : "    Linux and Open Source", "value" : "blog/open-source" }, { "name" : "    London Calling", "value" : "blog/london" }, { "name" : "    Mapping Babel", "value" : "blog/mapping-babel" }, { "name" : "    Mixed Signals", "value" : "blog/mixed-signals" }, { "name" : "    Mobile India", "value" : "blog/mobile-india" }, { "name" : "    Mobile News", "value" : "blog/mobile-news" }, { "name" : "    Networking", "value" : "blog/networking" }, { "name" : "    Norse Code", "value" : "blog/norse-code" }, { "name" : "    Null Pointer", "value" : "blog/null-pointer" }, { "name" : "    The Full Tilt", "value" : "blog/the-full-tilt" }, { "name" : "    Pinoy Post", "value" : "blog/pinoy-post" }, { "name" : "    Practically Tech", "value" : "blog/practically-tech" }, { "name" : "    Product Central", "value" : "blog/product-central" }, { "name" : "    Pulp Tech", "value" : "blog/violetblue" }, { "name" : "    Qubits and Pieces", "value" : "blog/qubits-and-pieces" }, { "name" : "    Securify This!", "value" : "blog/securify-this" }, { "name" : "    Service Oriented", "value" : "blog/service-oriented" }, { "name" : "    Small Talk", "value" : "blog/small-talk" }, { "name" : "    Small Business Matters", "value" : "blog/small-business-matters" }, { "name" : "    Smartphones and Cell Phones", "value" : "blog/cell-phones" }, { "name" : "    Social Business", "value" : "blog/feeds" }, { "name" : "    Social CRM: The Conversation", "value" : "blog/crm" }, { "name" : "    Software & Services Safari", "value" : "blog/sommer" }, { "name" : "    Storage Bits", "value" : "blog/storage" }, { "name" : "    Stacking up Open Clouds", "value" : "blog/apac-redhat" }, { "name" : "    Techie Isles", "value" : "blog/techie-isles" }, { "name" : "    Technolatte", "value" : "blog/technolatte" }, { "name" : "    Tech Podium", "value" : "blog/tech-podium" }, { "name" : "    Tel Aviv Tech", "value" : "blog/tel-aviv" }, { "name" : "    Tech Broiler", "value" : "blog/perlow" }, { "name" : "    The SANMAN", "value" : "blog/the-sanman" }, { "name" : "    The open source revolution", "value" : "blog/the-open-source-revolution" }, { "name" : "    The German View", "value" : "blog/german" }, { "name" : "    The Ed Bott Report", "value" : "blog/bott" }, { "name" : "    The Mobile Gadgeteer", "value" : "blog/mobile-gadgeteer" }, { "name" : "    The Apple Core", "value" : "blog/apple" }, { "name" : "    Tom Foremski: IMHO", "value" : "blog/foremski" }, { "name" : "    Twisted Wire", "value" : "blog/twisted-wire" }, { "name" : "    Vive la tech", "value" : "blog/france" }, { "name" : "    Virtually Speaking", "value" : "blog/virtualization" }, { "name" : "    View from China", "value" : "blog/china" }, { "name" : "    Web design & Free Software", "value" : "blog/web-design-and-free-software" }, { "name" : "    ZDNet Government", "value" : "blog/government" }, { "name" : "    ZDNet UK Book Reviews", "value" : "blog/zdnet-uk-book-reviews" }, { "name" : "    ZDNet UK First Take", "value" : "blog/zdnet-uk-first-take" }, { "name" : "    Zero Day", "value" : "blog/security" }, { "name" : "", "value" : "" }, { "name" : "ZDNet Hot Topics RSS:", "value" : "" }, { "name" : "    Apple", "value" : "topic/apple" }, { "name" : "    Collaboration", "value" : "topic/collaboration" }, { "name" : "    Enterprise Software", "value" : "topic/enterprise-software" }, { "name" : "    Google", "value" : "topic/google" }, { "name" : "    Great debate", "value" : "topic/great-debate" }, { "name" : "    Hardware", "value" : "topic/hardware" }, { "name" : "    IBM", "value" : "topic/ibm" }, { "name" : "    iOS", "value" : "topic/ios" }, { "name" : "    iPhone", "value" : "topic/iphone" }, { "name" : "    iPad", "value" : "topic/ipad" }, { "name" : "    IT Priorities", "value" : "topic/it-priorities" }, { "name" : "    Laptops", "value" : "topic/laptops" }, { "name" : "    Legal", "value" : "topic/legal" }, { "name" : "    Linux", "value" : "topic/linux" }, { "name" : "    Microsoft", "value" : "topic/microsoft" }, { "name" : "    Mobile OS", "value" : "topic/mobile-os" }, { "name" : "    Mobility", "value" : "topic/mobility" }, { "name" : "    Networking", "value" : "topic/networking" }, { "name" : "    Oracle", "value" : "topic/oracle" }, { "name" : "    Processors", "value" : "topic/processors" }, { "name" : "    Samsung", "value" : "topic/samsung" }, { "name" : "    Security", "value" : "topic/security" }, { "name" : "    Small business: going big on mobility", "value" : "topic/small-business-going-big-on-mobility" }, { "name" : "", "value" : "" }, { "name" : "Product Blogs:", "value" : "" }, { "name" : "    Digital Cameras & Camcorders", "value" : "blog/digitalcameras" }, { "name" : "    Home Theater", "value" : "blog/home-theater" }, { "name" : "    Laptops and Desktops", "value" : "blog/computers" }, { "name" : "    The Mobile Gadgeteer", "value" : "blog/mobile-gadgeteer" }, { "name" : "    Smartphones and Cell Phones", "value" : "blog/cell-phones" }, { "name" : "    The ToyBox", "value" : "blog/gadgetreviews" }, { "name" : "", "value" : "" }, { "name" : "Vertical Blogs:", "value" : "" }, { "name" : "    ZDNet Education", "value" : "blog/education" }, { "name" : "    ZDNet Healthcare", "value" : "blog/healthcare" }, { "name" : "    ZDNet Government", "value" : "blog/government" } ] } ]'; } public function collectData(array $param) { function StripCDATA($string) { $string = str_replace('', '', $string); return trim($string); } function ExtractFromDelimiters($string, $start, $end) { if (strpos($string, $start) !== false) { $section_retrieved = substr($string, strpos($string, $start) + strlen($start)); $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end)); return $section_retrieved; } return false; } function StripWithDelimiters($string, $start, $end) { while (strpos($string, $start) !== false) { $section_to_remove = substr($string, strpos($string, $start)); $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end)); $string = str_replace($section_to_remove, '', $string); } return $string; } function StripRecursiveHTMLSection($string, $tag_name, $tag_start) { $open_tag = '<'.$tag_name; $close_tag = ''; $close_tag_length = strlen($close_tag); if (strpos($tag_start, $open_tag) === 0) { while (strpos($string, $tag_start) !== false) { $max_recursion = 100; $section_to_remove = null; $section_start = strpos($string, $tag_start); $search_offset = $section_start; do { $max_recursion--; $section_end = strpos($string, $close_tag, $search_offset); $search_offset = $section_end + $close_tag_length; $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length); $open_tag_count = substr_count($section_to_remove, $open_tag); $close_tag_count = substr_count($section_to_remove, $close_tag); } while ($open_tag_count > $close_tag_count && $max_recursion > 0); $string = str_replace($section_to_remove, '', $string); } } return $string; } $baseUri = $this->getURI(); $feed = $param['feed']; if (empty($feed)) $this->returnClientError('Please select a feed to display.'); if (strpos($feed, 'downloads!') !== false) { $feed = str_replace('downloads!', '', $feed); $baseUri = str_replace('www.', 'downloads.', $baseUri); } if ($feed !== preg_replace('/[^a-zA-Z0-9-\/]+/', '', $feed) || substr_count($feed, '/') > 1 || strlen($feed > 64)) $this->returnClientError('Invalid "feed" parameter.'); $url = $baseUri.trim($feed, '/').'/rss.xml'; $html = $this->getSimpleHTMLDOM($url) or $this->returnServerError('Could not request ZDNet: '.$url); $limit = 0; foreach ($html->find('item') as $element) { if ($limit < 10) { $article_url = preg_replace('/([^#]+)#ftag=.*/', '$1', StripCDATA(ExtractFromDelimiters($element->innertext, '', ''))); $article_author = StripCDATA(ExtractFromDelimiters($element->innertext, 'role="author">', '<')); $article_title = StripCDATA($element->find('title', 0)->plaintext); $article_subtitle = StripCDATA($element->find('description', 0)->plaintext); $article_timestamp = strtotime(StripCDATA($element->find('pubDate', 0)->plaintext)); $article = $this->getSimpleHTMLDOM($article_url) or $this->returnServerError('Could not request ZDNet: '.$article_url); if (!empty($article_author)) $author = $article_author; else { $author = $article->find('meta[name=author]', 0); if (is_object($author)) $author = $author->content; else $author = 'ZDNet'; } $thumbnail = $article->find('meta[itemprop=image]', 0); if (is_object($thumbnail)) $thumbnail = $thumbnail->content; else $thumbnail = ''; $contents = $article->find('article', 0)->innertext; foreach (array( '
'); $contents = StripWithDelimiters($contents, ''); $contents = trim(StripWithDelimiters($contents, '

'; //Include thumbnail $contents = $content_img .'

'.$article_subtitle.'

' .$contents; $item = new \Item(); $item->author = $author; $item->uri = $article_url; $item->title = $article_title; $item->timestamp = $article_timestamp; $item->content = $contents; $this->items[] = $item; $limit++; } } } }