blob: 5a45be8ddc49005be18f82d4caccadee25f3f56a [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 {
Daniel Hunsaker8626e932013-03-04 05:14:22 -0700214 exit('<?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 }
Barry Mienydd671972010-10-04 16:33:58 +0200216
Derek Allard2067d1a2008-11-13 22:59:24 +0000217 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200218
Derek Allard2067d1a2008-11-13 22:59:24 +0000219 /**
220 * Send Trackback Success Message
221 *
222 * This should be called when a trackback has been
223 * successfully received and inserted.
224 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000225 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200226 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200227 public function send_success()
Derek Allard2067d1a2008-11-13 22:59:24 +0000228 {
Daniel Hunsaker8626e932013-03-04 05:14:22 -0700229 exit('<?xml version="1.0" encoding="utf-8"?'.">\n<response>\n<error>0</error>\n</response>");
Derek Allard2067d1a2008-11-13 22:59:24 +0000230 }
Barry Mienydd671972010-10-04 16:33:58 +0200231
Derek Allard2067d1a2008-11-13 22:59:24 +0000232 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200233
Derek Allard2067d1a2008-11-13 22:59:24 +0000234 /**
235 * Fetch a particular item
236 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000237 * @param string
238 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200239 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200240 public function data($item)
Derek Allard2067d1a2008-11-13 22:59:24 +0000241 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300242 return isset($this->data[$item]) ? $this->data[$item] : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000243 }
244
245 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200246
Derek Allard2067d1a2008-11-13 22:59:24 +0000247 /**
248 * Process Trackback
249 *
250 * Opens a socket connection and passes the data to
Andrey Andreev426faa92012-04-03 19:03:58 +0300251 * the server. Returns TRUE on success, FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000252 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000253 * @param string
254 * @param string
255 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200256 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200257 public function process($url, $data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000258 {
259 $target = parse_url($url);
Barry Mienydd671972010-10-04 16:33:58 +0200260
Derek Allard2067d1a2008-11-13 22:59:24 +0000261 // Open the socket
262 if ( ! $fp = @fsockopen($target['host'], 80))
263 {
264 $this->set_error('Invalid Connection: '.$url);
265 return FALSE;
266 }
267
268 // Build the path
Andrey Andreev5b5401a2013-01-10 17:38:08 +0200269 $path = isset($target['path']) ? $target['path'] : $url;
270 empty($target['query']) OR $path .= '?'.$target['query'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000271
272 // Add the Trackback ID to the data string
273 if ($id = $this->get_id($url))
274 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300275 $data = 'tb_id='.$id.'&'.$data;
Derek Allard2067d1a2008-11-13 22:59:24 +0000276 }
277
278 // Transfer the data
Andrey Andreev426faa92012-04-03 19:03:58 +0300279 fputs($fp, 'POST '.$path." HTTP/1.0\r\n");
280 fputs($fp, 'Host: '.$target['host']."\r\n");
281 fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
282 fputs($fp, 'Content-length: '.strlen($data)."\r\n");
283 fputs($fp, "Connection: close\r\n\r\n");
284 fputs($fp, $data);
Derek Allard2067d1a2008-11-13 22:59:24 +0000285
286 // Was it successful?
Barry Mienydd671972010-10-04 16:33:58 +0200287
Andrey Andreev426faa92012-04-03 19:03:58 +0300288 $this->response = '';
Pascal Kriete14287f32011-02-14 13:39:34 -0500289 while ( ! feof($fp))
Derek Allard2067d1a2008-11-13 22:59:24 +0000290 {
291 $this->response .= fgets($fp, 128);
292 }
293 @fclose($fp);
Barry Mienydd671972010-10-04 16:33:58 +0200294
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200295 if (stripos($this->response, '<error>0</error>') === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000296 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300297 $message = preg_match('/<message>(.*?)<\/message>/is', $this->response, $match) ? trim($match[1]) : 'An unknown error was encountered';
Derek Allard2067d1a2008-11-13 22:59:24 +0000298 $this->set_error($message);
299 return FALSE;
300 }
301
302 return TRUE;
303 }
Barry Mienydd671972010-10-04 16:33:58 +0200304
Derek Allard2067d1a2008-11-13 22:59:24 +0000305 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200306
Derek Allard2067d1a2008-11-13 22:59:24 +0000307 /**
308 * Extract Trackback URLs
309 *
310 * This function lets multiple trackbacks be sent.
311 * It takes a string of URLs (separated by comma or
312 * space) and puts each URL into an array
313 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000314 * @param string
315 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200316 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200317 public function extract_urls($urls)
Barry Mienydd671972010-10-04 16:33:58 +0200318 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300319 // Remove the pesky white space and replace with a comma, then replace doubles.
320 $urls = str_replace(',,', ',', preg_replace('/\s*(\S+)\s*/', '\\1,', $urls));
Barry Mienydd671972010-10-04 16:33:58 +0200321
Derek Allard2067d1a2008-11-13 22:59:24 +0000322 // Remove any comma that might be at the end
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200323 if (substr($urls, -1) === ',')
Derek Allard2067d1a2008-11-13 22:59:24 +0000324 {
325 $urls = substr($urls, 0, -1);
326 }
Barry Mienydd671972010-10-04 16:33:58 +0200327
Andrey Andreev426faa92012-04-03 19:03:58 +0300328 // Break into an array via commas and remove duplicates
329 $urls = array_unique(preg_split('/[,]/', $urls));
Barry Mienydd671972010-10-04 16:33:58 +0200330
Derek Allard2067d1a2008-11-13 22:59:24 +0000331 array_walk($urls, array($this, 'validate_url'));
Barry Mienydd671972010-10-04 16:33:58 +0200332
Derek Allard2067d1a2008-11-13 22:59:24 +0000333 return $urls;
334 }
Barry Mienydd671972010-10-04 16:33:58 +0200335
Derek Allard2067d1a2008-11-13 22:59:24 +0000336 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200337
Derek Allard2067d1a2008-11-13 22:59:24 +0000338 /**
339 * Validate URL
340 *
341 * Simply adds "http://" if missing
342 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000343 * @param string
Andrey Andreev426faa92012-04-03 19:03:58 +0300344 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200345 */
Andrey Andreev426faa92012-04-03 19:03:58 +0300346 public function validate_url(&$url)
Derek Allard2067d1a2008-11-13 22:59:24 +0000347 {
348 $url = trim($url);
349
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200350 if (strpos($url, 'http') !== 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000351 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200352 $url = 'http://'.$url;
Derek Allard2067d1a2008-11-13 22:59:24 +0000353 }
354 }
Barry Mienydd671972010-10-04 16:33:58 +0200355
Derek Allard2067d1a2008-11-13 22:59:24 +0000356 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200357
Derek Allard2067d1a2008-11-13 22:59:24 +0000358 /**
359 * Find the Trackback URL's ID
360 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000361 * @param string
362 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200363 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200364 public function get_id($url)
Barry Mienydd671972010-10-04 16:33:58 +0200365 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300366 $tb_id = '';
Barry Mienydd671972010-10-04 16:33:58 +0200367
Robin Sowell76b369e2010-03-19 11:15:28 -0400368 if (strpos($url, '?') !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000369 {
370 $tb_array = explode('/', $url);
Derek Jones37f4b9c2011-07-01 17:56:50 -0500371 $tb_end = $tb_array[count($tb_array)-1];
Barry Mienydd671972010-10-04 16:33:58 +0200372
Derek Allard2067d1a2008-11-13 22:59:24 +0000373 if ( ! is_numeric($tb_end))
374 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500375 $tb_end = $tb_array[count($tb_array)-2];
Derek Allard2067d1a2008-11-13 22:59:24 +0000376 }
Barry Mienydd671972010-10-04 16:33:58 +0200377
Derek Allard2067d1a2008-11-13 22:59:24 +0000378 $tb_array = explode('=', $tb_end);
379 $tb_id = $tb_array[count($tb_array)-1];
380 }
381 else
382 {
Derek Jones1322ec52009-03-11 17:01:14 +0000383 $url = rtrim($url, '/');
Barry Mienydd671972010-10-04 16:33:58 +0200384
Derek Allard2067d1a2008-11-13 22:59:24 +0000385 $tb_array = explode('/', $url);
386 $tb_id = $tb_array[count($tb_array)-1];
Barry Mienydd671972010-10-04 16:33:58 +0200387
Derek Allard2067d1a2008-11-13 22:59:24 +0000388 if ( ! is_numeric($tb_id))
389 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300390 $tb_id = $tb_array[count($tb_array)-2];
Derek Allard2067d1a2008-11-13 22:59:24 +0000391 }
Barry Mienydd671972010-10-04 16:33:58 +0200392 }
393
Andrey Andreev7a7ad782012-11-12 17:21:01 +0200394 return ctype_digit((string) $tb_id) ? $tb_id : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000395 }
Barry Mienydd671972010-10-04 16:33:58 +0200396
Derek Allard2067d1a2008-11-13 22:59:24 +0000397 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200398
Derek Allard2067d1a2008-11-13 22:59:24 +0000399 /**
400 * Convert Reserved XML characters to Entities
401 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000402 * @param string
403 * @return string
404 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200405 public function convert_xml($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000406 {
407 $temp = '__TEMP_AMPERSANDS__';
Barry Mienydd671972010-10-04 16:33:58 +0200408
Andrey Andreev426faa92012-04-03 19:03:58 +0300409 $str = preg_replace(array('/&#(\d+);/', '/&(\w+);/'), $temp.'\\1;', $str);
Barry Mienydd671972010-10-04 16:33:58 +0200410
Andrey Andreev426faa92012-04-03 19:03:58 +0300411 $str = str_replace(array('&', '<', '>', '"', "'", '-'),
412 array('&amp;', '&lt;', '&gt;', '&quot;', '&#39;', '&#45;'),
413 $str);
Barry Mienydd671972010-10-04 16:33:58 +0200414
Andrey Andreev426faa92012-04-03 19:03:58 +0300415 return preg_replace(array('/'.$temp.'(\d+);/', '/'.$temp.'(\w+);/'), array('&#\\1;', '&\\1;'), $str);
Barry Mienydd671972010-10-04 16:33:58 +0200416 }
417
Derek Allard2067d1a2008-11-13 22:59:24 +0000418 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200419
Derek Allard2067d1a2008-11-13 22:59:24 +0000420 /**
421 * Character limiter
422 *
423 * Limits the string based on the character count. Will preserve complete words.
424 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000425 * @param string
Andrey Andreev426faa92012-04-03 19:03:58 +0300426 * @param int
Derek Allard2067d1a2008-11-13 22:59:24 +0000427 * @param string
428 * @return string
429 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200430 public function limit_characters($str, $n = 500, $end_char = '&#8230;')
Derek Allard2067d1a2008-11-13 22:59:24 +0000431 {
432 if (strlen($str) < $n)
433 {
434 return $str;
435 }
Barry Mienydd671972010-10-04 16:33:58 +0200436
Andrey Andreev426faa92012-04-03 19:03:58 +0300437 $str = preg_replace('/\s+/', ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
Barry Mienydd671972010-10-04 16:33:58 +0200438
Derek Allard2067d1a2008-11-13 22:59:24 +0000439 if (strlen($str) <= $n)
440 {
441 return $str;
442 }
Barry Mienydd671972010-10-04 16:33:58 +0200443
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200444 $out = '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000445 foreach (explode(' ', trim($str)) as $val)
446 {
Barry Mienydd671972010-10-04 16:33:58 +0200447 $out .= $val.' ';
Derek Allard2067d1a2008-11-13 22:59:24 +0000448 if (strlen($out) >= $n)
449 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200450 return rtrim($out).$end_char;
Barry Mienydd671972010-10-04 16:33:58 +0200451 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000452 }
453 }
Barry Mienydd671972010-10-04 16:33:58 +0200454
Derek Allard2067d1a2008-11-13 22:59:24 +0000455 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200456
Derek Allard2067d1a2008-11-13 22:59:24 +0000457 /**
458 * High ASCII to Entities
459 *
460 * Converts Hight ascii text and MS Word special chars
461 * to character entities
462 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000463 * @param string
464 * @return string
465 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200466 public function convert_ascii($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000467 {
Barry Mienydd671972010-10-04 16:33:58 +0200468 $count = 1;
469 $out = '';
470 $temp = array();
471
472 for ($i = 0, $s = strlen($str); $i < $s; $i++)
473 {
474 $ordinal = ord($str[$i]);
475
476 if ($ordinal < 128)
477 {
478 $out .= $str[$i];
479 }
480 else
481 {
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200482 if (count($temp) === 0)
Barry Mienydd671972010-10-04 16:33:58 +0200483 {
484 $count = ($ordinal < 224) ? 2 : 3;
485 }
486
487 $temp[] = $ordinal;
488
Andrey Andreevd9cfa7b2011-12-25 16:32:59 +0200489 if (count($temp) === $count)
Barry Mienydd671972010-10-04 16:33:58 +0200490 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300491 $number = ($count === 3)
492 ? (($temp[0] % 16) * 4096) + (($temp[1] % 64) * 64) + ($temp[2] % 64)
493 : (($temp[0] % 32) * 64) + ($temp[1] % 64);
Barry Mienydd671972010-10-04 16:33:58 +0200494
495 $out .= '&#'.$number.';';
496 $count = 1;
497 $temp = array();
498 }
499 }
500 }
501
502 return $out;
Derek Allard2067d1a2008-11-13 22:59:24 +0000503 }
Barry Mienydd671972010-10-04 16:33:58 +0200504
Derek Allard2067d1a2008-11-13 22:59:24 +0000505 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200506
Derek Allard2067d1a2008-11-13 22:59:24 +0000507 /**
508 * Set error message
509 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000510 * @param string
511 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200512 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200513 public function set_error($msg)
Derek Allard2067d1a2008-11-13 22:59:24 +0000514 {
515 log_message('error', $msg);
516 $this->error_msg[] = $msg;
517 }
Barry Mienydd671972010-10-04 16:33:58 +0200518
Derek Allard2067d1a2008-11-13 22:59:24 +0000519 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200520
Derek Allard2067d1a2008-11-13 22:59:24 +0000521 /**
522 * Show error messages
523 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000524 * @param string
525 * @param string
526 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200527 */
Andrey Andreev4eea9892011-12-19 12:05:41 +0200528 public function display_errors($open = '<p>', $close = '</p>')
Barry Mienydd671972010-10-04 16:33:58 +0200529 {
Andrey Andreev426faa92012-04-03 19:03:58 +0300530 return (count($this->error_msg) > 0) ? $open.implode($close.$open, $this->error_msg).$close : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000531 }
532
533}
Derek Allard2067d1a2008-11-13 22:59:24 +0000534
535/* End of file Trackback.php */
Andrey Andreev426faa92012-04-03 19:03:58 +0300536/* Location: ./system/libraries/Trackback.php */