blob: ecc7129e3ff4ac914ee543aac229bd1928c69f5e [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev4eea9892011-12-19 12:05:41 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev4eea9892011-12-19 12:05:41 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Andrey Andreev80500af2013-01-01 08:16:53 +020021 * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000028
Derek Allard2067d1a2008-11-13 22:59:24 +000029/**
30 * Trackback Class
31 *
32 * Trackback Sending/Receiving Class
33 *
34 * @package CodeIgniter
35 * @subpackage Libraries
36 * @category Trackbacks
Derek Jonesf4a4bd82011-10-20 12:18:42 -050037 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000038 * @link http://codeigniter.com/user_guide/libraries/trackback.html
39 */
40class CI_Trackback {
Barry Mienydd671972010-10-04 16:33:58 +020041
Andrey Andreev0fa95bd2012-11-01 23:33:14 +020042 /**
43 * Character set
44 *
45 * @var string
46 */
Andrey Andreev3a459572011-12-21 11:23:11 +020047 public $charset = 'UTF-8';
Andrey Andreev0fa95bd2012-11-01 23:33:14 +020048
49 /**
50 * Trackback data
51 *
52 * @var array
53 */
54 public $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => '');
55
56 /**
57 * Convert ASCII flag
58 *
59 * Whether to convert high-ASCII and MS Word
60 * characters to HTML entities.
61 *
62 * @var bool
63 */
Andrey Andreev3a459572011-12-21 11:23:11 +020064 public $convert_ascii = TRUE;
Andrey Andreev0fa95bd2012-11-01 23:33:14 +020065
66 /**
67 * Response
68 *
69 * @var string
70 */
71 public $response = '';
72
73 /**
74 * Error messages list
75 *
76 * @var string[]
77 */
78 public $error_msg = array();
79
80 // --------------------------------------------------------------------
Derek Allard2067d1a2008-11-13 22:59:24 +000081
Andrey Andreev5fd3ae82012-10-24 14:55:35 +030082 /**
83 * Constructor
84 *
85 * @return void
86 */
Greg Akera9263282010-11-10 15:26:43 -060087 public function __construct()
Derek Allard2067d1a2008-11-13 22:59:24 +000088 {
Andrey Andreev426faa92012-04-03 19:03:58 +030089 log_message('debug', 'Trackback Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +000090 }
Barry Mienydd671972010-10-04 16:33:58 +020091
Derek Allard2067d1a2008-11-13 22:59:24 +000092 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +020093
Derek Allard2067d1a2008-11-13 22:59:24 +000094 /**
95 * Send Trackback
96 *
Derek Allard2067d1a2008-11-13 22:59:24 +000097 * @param array
98 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +020099 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200100 public function send($tb_data)
Barry Mienydd671972010-10-04 16:33:58 +0200101 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000102 if ( ! is_array($tb_data))
103 {
104 $this->set_error('The send() method must be passed an array');
105 return FALSE;
106 }
Barry Mienydd671972010-10-04 16:33:58 +0200107
Derek Allard2067d1a2008-11-13 22:59:24 +0000108 // Pre-process the Trackback Data
109 foreach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item)
110 {
111 if ( ! isset($tb_data[$item]))
112 {
113 $this->set_error('Required item missing: '.$item);
114 return FALSE;
115 }
Barry Mienydd671972010-10-04 16:33:58 +0200116
Derek Allard2067d1a2008-11-13 22:59:24 +0000117 switch ($item)
118 {
119 case 'ping_url' : $$item = $this->extract_urls($tb_data[$item]);
120 break;
121 case 'excerpt' : $$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
122 break;
Barry Mienydd671972010-10-04 16:33:58 +0200123 case 'url' : $$item = str_replace('&#45;', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
Derek Allard2067d1a2008-11-13 22:59:24 +0000124 break;
125 default : $$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item])));
126 break;
127 }
128
129 // Convert High ASCII Characters
Alex Bilbied261b1e2012-06-02 11:12:16 +0100130 if ($this->convert_ascii === TRUE && in_array($item, array('excerpt', 'title', 'blog_name')))
Derek Allard2067d1a2008-11-13 22:59:24 +0000131 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200132 $$item = $this->convert_ascii($$item);
Derek Allard2067d1a2008-11-13 22:59:24 +0000133 }
134 }
135
136 // Build the Trackback data string
Andrey Andreev426faa92012-04-03 19:03:58 +0300137 $charset = isset($tb_data['charset']) ? $tb_data['charset'] : $this->charset;
Barry Mienydd671972010-10-04 16:33:58 +0200138
Andrey Andreev426faa92012-04-03 19:03:58 +0300139 $data = 'url='.rawurlencode($url).'&title='.rawurlencode($title).'&blog_name='.rawurlencode($blog_name)
140 .'&excerpt='.rawurlencode($excerpt).'&charset='.rawurlencode($charset);
Barry Mienydd671972010-10-04 16:33:58 +0200141
Derek Allard2067d1a2008-11-13 22:59:24 +0000142 // Send Trackback(s)
143 $return = TRUE;
144 if (count($ping_url) > 0)
145 {
146 foreach ($ping_url as $url)
147 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100148 if ($this->process($url, $data) === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000149 {
150 $return = FALSE;
151 }
Barry Mienydd671972010-10-04 16:33:58 +0200152 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000153 }
154
155 return $return;
156 }
Barry Mienydd671972010-10-04 16:33:58 +0200157
Derek Allard2067d1a2008-11-13 22:59:24 +0000158 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200159
Derek Allard2067d1a2008-11-13 22:59:24 +0000160 /**
Derek Jones37f4b9c2011-07-01 17:56:50 -0500161 * Receive Trackback Data
Derek Allard2067d1a2008-11-13 22:59:24 +0000162 *
163 * This function simply validates the incoming TB data.
Derek Jones5052e272010-03-02 22:53:38 -0600164 * It returns FALSE on failure and TRUE on success.
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 * If the data is valid it is set to the $this->data array
166 * so that it can be inserted into a database.
167 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200169 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200170 public function receive()
Barry Mienydd671972010-10-04 16:33:58 +0200171 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000172 foreach (array('url', 'title', 'blog_name', 'excerpt') as $val)
173 {
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300174 if (empty($_POST[$val]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000175 {
176 $this->set_error('The following required POST variable is missing: '.$val);
177 return FALSE;
178 }
Barry Mienydd671972010-10-04 16:33:58 +0200179
Andrey Andreev426faa92012-04-03 19:03:58 +0300180 $this->data['charset'] = isset($_POST['charset']) ? strtoupper(trim($_POST['charset'])) : 'auto';
Barry Mienydd671972010-10-04 16:33:58 +0200181
Alex Bilbied261b1e2012-06-02 11:12:16 +0100182 if ($val !== 'url' && MB_ENABLED === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000183 {
184 $_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']);
185 }
Barry Mienydd671972010-10-04 16:33:58 +0200186
Alex Bilbied261b1e2012-06-02 11:12:16 +0100187 $_POST[$val] = ($val !== 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]);
Barry Mienydd671972010-10-04 16:33:58 +0200188
Alex Bilbied261b1e2012-06-02 11:12:16 +0100189 if ($val === 'excerpt')
Derek Allard2067d1a2008-11-13 22:59:24 +0000190 {
191 $_POST['excerpt'] = $this->limit_characters($_POST['excerpt']);
192 }
Barry Mienydd671972010-10-04 16:33:58 +0200193
Derek Allard2067d1a2008-11-13 22:59:24 +0000194 $this->data[$val] = $_POST[$val];
195 }
196
197 return TRUE;
Barry Mienydd671972010-10-04 16:33:58 +0200198 }
199
Derek Allard2067d1a2008-11-13 22:59:24 +0000200 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200201
Derek Allard2067d1a2008-11-13 22:59:24 +0000202 /**
203 * Send Trackback Error Message
204 *
Andrey Andreev426faa92012-04-03 19:03:58 +0300205 * Allows custom errors to be set. By default it
Derek Allard2067d1a2008-11-13 22:59:24 +0000206 * sends the "incomplete information" error, as that's
207 * the most common one.
208 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000209 * @param string
210 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200211 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200212 public function send_error($message = 'Incomplete Information')
Derek Allard2067d1a2008-11-13 22:59:24 +0000213 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300214 echo '<?xml version="1.0" encoding="utf-8"?'.">\n<response>\n<error>1</error>\n<message>".$message."</message>\n</response>";
Derek Allard2067d1a2008-11-13 22:59:24 +0000215 exit;
216 }
Barry Mienydd671972010-10-04 16:33:58 +0200217
Derek Allard2067d1a2008-11-13 22:59:24 +0000218 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200219
Derek Allard2067d1a2008-11-13 22:59:24 +0000220 /**
221 * Send Trackback Success Message
222 *
223 * This should be called when a trackback has been
224 * successfully received and inserted.
225 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000226 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200227 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200228 public function send_success()
Derek Allard2067d1a2008-11-13 22:59:24 +0000229 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300230 echo '<?xml version="1.0" encoding="utf-8"?'.">\n<response>\n<error>0</error>\n</response>";
Derek Allard2067d1a2008-11-13 22:59:24 +0000231 exit;
232 }
Barry Mienydd671972010-10-04 16:33:58 +0200233
Derek Allard2067d1a2008-11-13 22:59:24 +0000234 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200235
Derek Allard2067d1a2008-11-13 22:59:24 +0000236 /**
237 * Fetch a particular item
238 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000239 * @param string
240 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200241 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200242 public function data($item)
Derek Allard2067d1a2008-11-13 22:59:24 +0000243 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300244 return isset($this->data[$item]) ? $this->data[$item] : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000245 }
246
247 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200248
Derek Allard2067d1a2008-11-13 22:59:24 +0000249 /**
250 * Process Trackback
251 *
252 * Opens a socket connection and passes the data to
Andrey Andreev426faa92012-04-03 19:03:58 +0300253 * the server. Returns TRUE on success, FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000254 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000255 * @param string
256 * @param string
257 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200258 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200259 public function process($url, $data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000260 {
261 $target = parse_url($url);
Barry Mienydd671972010-10-04 16:33:58 +0200262
Derek Allard2067d1a2008-11-13 22:59:24 +0000263 // Open the socket
264 if ( ! $fp = @fsockopen($target['host'], 80))
265 {
266 $this->set_error('Invalid Connection: '.$url);
267 return FALSE;
268 }
269
270 // Build the path
Andrey Andreev5b5401a2013-01-10 17:38:08 +0200271 $path = isset($target['path']) ? $target['path'] : $url;
272 empty($target['query']) OR $path .= '?'.$target['query'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000273
274 // Add the Trackback ID to the data string
275 if ($id = $this->get_id($url))
276 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300277 $data = 'tb_id='.$id.'&'.$data;
Derek Allard2067d1a2008-11-13 22:59:24 +0000278 }
279
280 // Transfer the data
Andrey Andreev426faa92012-04-03 19:03:58 +0300281 fputs($fp, 'POST '.$path." HTTP/1.0\r\n");
282 fputs($fp, 'Host: '.$target['host']."\r\n");
283 fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
284 fputs($fp, 'Content-length: '.strlen($data)."\r\n");
285 fputs($fp, "Connection: close\r\n\r\n");
286 fputs($fp, $data);
Derek Allard2067d1a2008-11-13 22:59:24 +0000287
288 // Was it successful?
Barry Mienydd671972010-10-04 16:33:58 +0200289
Andrey Andreev426faa92012-04-03 19:03:58 +0300290 $this->response = '';
Pascal Kriete14287f32011-02-14 13:39:34 -0500291 while ( ! feof($fp))
Derek Allard2067d1a2008-11-13 22:59:24 +0000292 {
293 $this->response .= fgets($fp, 128);
294 }
295 @fclose($fp);
Barry Mienydd671972010-10-04 16:33:58 +0200296
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200297 if (stripos($this->response, '<error>0</error>') === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000298 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300299 $message = preg_match('/<message>(.*?)<\/message>/is', $this->response, $match) ? trim($match[1]) : 'An unknown error was encountered';
Derek Allard2067d1a2008-11-13 22:59:24 +0000300 $this->set_error($message);
301 return FALSE;
302 }
303
304 return TRUE;
305 }
Barry Mienydd671972010-10-04 16:33:58 +0200306
Derek Allard2067d1a2008-11-13 22:59:24 +0000307 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200308
Derek Allard2067d1a2008-11-13 22:59:24 +0000309 /**
310 * Extract Trackback URLs
311 *
312 * This function lets multiple trackbacks be sent.
313 * It takes a string of URLs (separated by comma or
314 * space) and puts each URL into an array
315 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000316 * @param string
317 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200318 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200319 public function extract_urls($urls)
Barry Mienydd671972010-10-04 16:33:58 +0200320 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300321 // Remove the pesky white space and replace with a comma, then replace doubles.
322 $urls = str_replace(',,', ',', preg_replace('/\s*(\S+)\s*/', '\\1,', $urls));
Barry Mienydd671972010-10-04 16:33:58 +0200323
Derek Allard2067d1a2008-11-13 22:59:24 +0000324 // Remove any comma that might be at the end
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200325 if (substr($urls, -1) === ',')
Derek Allard2067d1a2008-11-13 22:59:24 +0000326 {
327 $urls = substr($urls, 0, -1);
328 }
Barry Mienydd671972010-10-04 16:33:58 +0200329
Andrey Andreev426faa92012-04-03 19:03:58 +0300330 // Break into an array via commas and remove duplicates
331 $urls = array_unique(preg_split('/[,]/', $urls));
Barry Mienydd671972010-10-04 16:33:58 +0200332
Derek Allard2067d1a2008-11-13 22:59:24 +0000333 array_walk($urls, array($this, 'validate_url'));
Barry Mienydd671972010-10-04 16:33:58 +0200334
Derek Allard2067d1a2008-11-13 22:59:24 +0000335 return $urls;
336 }
Barry Mienydd671972010-10-04 16:33:58 +0200337
Derek Allard2067d1a2008-11-13 22:59:24 +0000338 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200339
Derek Allard2067d1a2008-11-13 22:59:24 +0000340 /**
341 * Validate URL
342 *
343 * Simply adds "http://" if missing
344 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000345 * @param string
Andrey Andreev426faa92012-04-03 19:03:58 +0300346 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200347 */
Andrey Andreev426faa92012-04-03 19:03:58 +0300348 public function validate_url(&$url)
Derek Allard2067d1a2008-11-13 22:59:24 +0000349 {
350 $url = trim($url);
351
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200352 if (strpos($url, 'http') !== 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000353 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200354 $url = 'http://'.$url;
Derek Allard2067d1a2008-11-13 22:59:24 +0000355 }
356 }
Barry Mienydd671972010-10-04 16:33:58 +0200357
Derek Allard2067d1a2008-11-13 22:59:24 +0000358 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200359
Derek Allard2067d1a2008-11-13 22:59:24 +0000360 /**
361 * Find the Trackback URL's ID
362 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000363 * @param string
364 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200365 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200366 public function get_id($url)
Barry Mienydd671972010-10-04 16:33:58 +0200367 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300368 $tb_id = '';
Barry Mienydd671972010-10-04 16:33:58 +0200369
Robin Sowell76b369e2010-03-19 11:15:28 -0400370 if (strpos($url, '?') !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000371 {
372 $tb_array = explode('/', $url);
Derek Jones37f4b9c2011-07-01 17:56:50 -0500373 $tb_end = $tb_array[count($tb_array)-1];
Barry Mienydd671972010-10-04 16:33:58 +0200374
Derek Allard2067d1a2008-11-13 22:59:24 +0000375 if ( ! is_numeric($tb_end))
376 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500377 $tb_end = $tb_array[count($tb_array)-2];
Derek Allard2067d1a2008-11-13 22:59:24 +0000378 }
Barry Mienydd671972010-10-04 16:33:58 +0200379
Derek Allard2067d1a2008-11-13 22:59:24 +0000380 $tb_array = explode('=', $tb_end);
381 $tb_id = $tb_array[count($tb_array)-1];
382 }
383 else
384 {
Derek Jones1322ec52009-03-11 17:01:14 +0000385 $url = rtrim($url, '/');
Barry Mienydd671972010-10-04 16:33:58 +0200386
Derek Allard2067d1a2008-11-13 22:59:24 +0000387 $tb_array = explode('/', $url);
388 $tb_id = $tb_array[count($tb_array)-1];
Barry Mienydd671972010-10-04 16:33:58 +0200389
Derek Allard2067d1a2008-11-13 22:59:24 +0000390 if ( ! is_numeric($tb_id))
391 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300392 $tb_id = $tb_array[count($tb_array)-2];
Derek Allard2067d1a2008-11-13 22:59:24 +0000393 }
Barry Mienydd671972010-10-04 16:33:58 +0200394 }
395
Andrey Andreev7a7ad782012-11-12 17:21:01 +0200396 return ctype_digit((string) $tb_id) ? $tb_id : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000397 }
Barry Mienydd671972010-10-04 16:33:58 +0200398
Derek Allard2067d1a2008-11-13 22:59:24 +0000399 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200400
Derek Allard2067d1a2008-11-13 22:59:24 +0000401 /**
402 * Convert Reserved XML characters to Entities
403 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000404 * @param string
405 * @return string
406 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200407 public function convert_xml($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000408 {
409 $temp = '__TEMP_AMPERSANDS__';
Barry Mienydd671972010-10-04 16:33:58 +0200410
Andrey Andreev426faa92012-04-03 19:03:58 +0300411 $str = preg_replace(array('/&#(\d+);/', '/&(\w+);/'), $temp.'\\1;', $str);
Barry Mienydd671972010-10-04 16:33:58 +0200412
Andrey Andreev426faa92012-04-03 19:03:58 +0300413 $str = str_replace(array('&', '<', '>', '"', "'", '-'),
414 array('&amp;', '&lt;', '&gt;', '&quot;', '&#39;', '&#45;'),
415 $str);
Barry Mienydd671972010-10-04 16:33:58 +0200416
Andrey Andreev426faa92012-04-03 19:03:58 +0300417 return preg_replace(array('/'.$temp.'(\d+);/', '/'.$temp.'(\w+);/'), array('&#\\1;', '&\\1;'), $str);
Barry Mienydd671972010-10-04 16:33:58 +0200418 }
419
Derek Allard2067d1a2008-11-13 22:59:24 +0000420 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200421
Derek Allard2067d1a2008-11-13 22:59:24 +0000422 /**
423 * Character limiter
424 *
425 * Limits the string based on the character count. Will preserve complete words.
426 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000427 * @param string
Andrey Andreev426faa92012-04-03 19:03:58 +0300428 * @param int
Derek Allard2067d1a2008-11-13 22:59:24 +0000429 * @param string
430 * @return string
431 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200432 public function limit_characters($str, $n = 500, $end_char = '&#8230;')
Derek Allard2067d1a2008-11-13 22:59:24 +0000433 {
434 if (strlen($str) < $n)
435 {
436 return $str;
437 }
Barry Mienydd671972010-10-04 16:33:58 +0200438
Andrey Andreev426faa92012-04-03 19:03:58 +0300439 $str = preg_replace('/\s+/', ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
Barry Mienydd671972010-10-04 16:33:58 +0200440
Derek Allard2067d1a2008-11-13 22:59:24 +0000441 if (strlen($str) <= $n)
442 {
443 return $str;
444 }
Barry Mienydd671972010-10-04 16:33:58 +0200445
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200446 $out = '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000447 foreach (explode(' ', trim($str)) as $val)
448 {
Barry Mienydd671972010-10-04 16:33:58 +0200449 $out .= $val.' ';
Derek Allard2067d1a2008-11-13 22:59:24 +0000450 if (strlen($out) >= $n)
451 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200452 return rtrim($out).$end_char;
Barry Mienydd671972010-10-04 16:33:58 +0200453 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000454 }
455 }
Barry Mienydd671972010-10-04 16:33:58 +0200456
Derek Allard2067d1a2008-11-13 22:59:24 +0000457 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200458
Derek Allard2067d1a2008-11-13 22:59:24 +0000459 /**
460 * High ASCII to Entities
461 *
462 * Converts Hight ascii text and MS Word special chars
463 * to character entities
464 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000465 * @param string
466 * @return string
467 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200468 public function convert_ascii($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000469 {
Barry Mienydd671972010-10-04 16:33:58 +0200470 $count = 1;
471 $out = '';
472 $temp = array();
473
474 for ($i = 0, $s = strlen($str); $i < $s; $i++)
475 {
476 $ordinal = ord($str[$i]);
477
478 if ($ordinal < 128)
479 {
480 $out .= $str[$i];
481 }
482 else
483 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200484 if (count($temp) === 0)
Barry Mienydd671972010-10-04 16:33:58 +0200485 {
486 $count = ($ordinal < 224) ? 2 : 3;
487 }
488
489 $temp[] = $ordinal;
490
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200491 if (count($temp) === $count)
Barry Mienydd671972010-10-04 16:33:58 +0200492 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300493 $number = ($count === 3)
494 ? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64)
495 : (($temp[0] % 32) * 64) + ($temp[1] % 64);
Barry Mienydd671972010-10-04 16:33:58 +0200496
497 $out .= '&#'.$number.';';
498 $count = 1;
499 $temp = array();
500 }
501 }
502 }
503
504 return $out;
Derek Allard2067d1a2008-11-13 22:59:24 +0000505 }
Barry Mienydd671972010-10-04 16:33:58 +0200506
Derek Allard2067d1a2008-11-13 22:59:24 +0000507 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200508
Derek Allard2067d1a2008-11-13 22:59:24 +0000509 /**
510 * Set error message
511 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000512 * @param string
513 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200514 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200515 public function set_error($msg)
Derek Allard2067d1a2008-11-13 22:59:24 +0000516 {
517 log_message('error', $msg);
518 $this->error_msg[] = $msg;
519 }
Barry Mienydd671972010-10-04 16:33:58 +0200520
Derek Allard2067d1a2008-11-13 22:59:24 +0000521 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200522
Derek Allard2067d1a2008-11-13 22:59:24 +0000523 /**
524 * Show error messages
525 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000526 * @param string
527 * @param string
528 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200529 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200530 public function display_errors($open = '<p>', $close = '</p>')
Barry Mienydd671972010-10-04 16:33:58 +0200531 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300532 return (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000533 }
534
535}
Derek Allard2067d1a2008-11-13 22:59:24 +0000536
537/* End of file Trackback.php */
Andrey Andreev426faa92012-04-03 19:03:58 +0300538/* Location: ./system/libraries/Trackback.php */