]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - include/Dashlets/DashletRssFeedTitle.php
Release 6.4.0
[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         public function generateTitle() {
58                 if ($this->readFeed()) {
59                         $this->getTitle();
60                         if (!empty($this->title)) {
61                                 $this->convertEncoding();
62                                 $this->cutLength();
63                         }
64                 }
65                 return $this->title;
66         }
67
68         /**
69          * @todo use curl with waiting timeout instead of fopen
70          */
71         public function readFeed() {
72                 if ($this->url) {
73                         $fileOpen = @fopen($this->url, 'r');
74                         if ($fileOpen) {
75                                 $this->fileOpen = true;
76                                 $this->contents = fread($fileOpen, $this->readBytes);
77                                 fclose($fileOpen);
78                                 return true;
79                         }
80                 }
81                 return false;
82         }
83
84         /**
85          *
86          */
87         public function getTitle() {
88                 $matches = array ();
89                 preg_match("/<title>.*?<\/title>/i", $this->contents, $matches);
90                 if (isset($matches[0])) {
91                         $this->title = str_replace(array('<![CDATA[', '<title>', '</title>', ']]>'), '', $matches[0]);
92                 }
93         }
94
95         public function cutLength() {
96                 if (mb_strlen(trim($this->title), $this->defaultEncoding) > $this->cut) {
97                         $this->title = mb_substr($this->title, 0, $this->cut, $this->defaultEncoding) . $this->endWith;
98                 }
99         }
100
101         private function _identifyXmlEncoding() {
102                 $matches = array ();
103                 preg_match('/encoding\=*\".*?\"/', $this->contents, $matches);
104                 if (isset($matches[0])) {
105                         $this->xmlEncoding = trim(str_replace('encoding="', '"', $matches[0]), '"');
106                 }
107         }
108
109         public function convertEncoding() {
110                 $this->_identifyXmlEncoding();
111                 if ($this->xmlEncoding && $this->xmlEncoding != $this->defaultEncoding) {
112                         $this->title = iconv($this->xmlEncoding, $this->defaultEncoding, $this->title);
113                 }
114         }
115 }