]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - include/Dashlets/DashletRssFeedTitle.php
Release 6.2.4
[Github/sugarcrm.git] / include / Dashlets / DashletRssFeedTitle.php
1 <?php
2 /*********************************************************************************
3  * SugarCRM Community Edition is a customer relationship management program developed by
4  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
5  * 
6  * This program is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Affero General Public License version 3 as published by the
8  * Free Software Foundation with the addition of the following permission added
9  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
11  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12  * 
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
16  * details.
17  * 
18  * You should have received a copy of the GNU Affero General Public License along with
19  * this program; if not, see http://www.gnu.org/licenses or write to the Free
20  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  * 02110-1301 USA.
22  * 
23  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
24  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
25  * 
26  * The interactive user interfaces in modified source and object code versions
27  * of this program must display Appropriate Legal Notices, as required under
28  * Section 5 of the GNU Affero General Public License version 3.
29  * 
30  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31  * these Appropriate Legal Notices must retain the display of the "Powered by
32  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
33  * technical reasons, the Appropriate Legal Notices must display the words
34  * "Powered by SugarCRM".
35  ********************************************************************************/
36
37
38 /**
39  * Class for parsing title from RSS feed, and keep default encoding (UTF-8)
40  * Created: Sep 12, 2011
41  */
42 class DashletRssFeedTitle {
43         public $defaultEncoding = "UTF-8";
44         public $readBytes = 8192;
45         public $url;
46         public $cut = 70;
47         public $contents = "";
48         public $title = "";
49         public $endWith = "...";
50         public $xmlEncoding = false;
51         public $fileOpen = false;
52         
53         public function __construct($url) {
54                 $this->url = $url;
55         }
56         
57         /**
58          * Yeah, assign an empty string, because unset(classproperty) will cause an exception in php 5.3.3
59          *
60          */
61         public function __destruct() {
62                 $this->contents = '';
63         }
64         
65         public function generateTitle() {
66                 if ($this->readFeed()) {
67                         $this->getTitle(); 
68                         if (!empty($this->title)) {
69                                 $this->convertEncoding();
70                                 $this->cutLength();
71                         }
72                 }
73                 return $this->title;
74         }
75         
76         /**
77          * @todo use curl with waiting timeout instead of fopen
78          */
79         public function readFeed() {
80                 if ($this->url) {
81                         $fileOpen = @fopen($this->url, 'r');
82                         if ($fileOpen) {
83                                 $this->fileOpen = true;
84                                 $this->contents = fread($fileOpen, $this->readBytes);
85                                 fclose($fileOpen);
86                                 return true;
87                         }
88                 }
89                 return false;           
90         }
91         
92         /**
93          * 
94          */
95         public function getTitle() {
96                 $matches = array ();
97                 preg_match("/<title>.*?<\/title>/i", $this->contents, $matches);
98                 if (isset($matches[0])) {
99                         $this->title = str_replace(array('<![CDATA[', '<title>', '</title>', ']]>'), '', $matches[0]);
100                 }
101         }
102         
103         public function cutLength() {
104                 if (mb_strlen(trim($this->title), $this->defaultEncoding) > $this->cut) {
105                         $this->title = mb_substr($this->title, 0, $this->cut, $this->defaultEncoding) . $this->endWith;
106                 }
107         }
108         
109         private function _identifyXmlEncoding() {
110                 $matches = array ();
111                 preg_match('/encoding\=*\".*?\"/', $this->contents, $matches);
112                 if (isset($matches[0])) {
113                         $this->xmlEncoding = trim(str_replace('encoding="', '"', $matches[0]), '"');
114                 }
115         }
116         
117         public function convertEncoding() {
118                 $this->_identifyXmlEncoding();
119                 if ($this->xmlEncoding && $this->xmlEncoding != $this->defaultEncoding) {
120                         $this->title = iconv($this->xmlEncoding, $this->defaultEncoding, $this->title);
121                 }
122         }
123 }