1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: if (!defined('XOOPS_ROOT_PATH')) exit();
12:
13: 14: 15: 16:
17: class Legacy_TextFilter extends XCube_TextFilter
18: {
19: 20: 21:
22: var $mMakeXCodeConvertTable = null;
23: 24: 25:
26: var $mMakeXCodeCheckImgPatterns = null;
27: 28: 29:
30: var $mMakeClickableConvertTable = null;
31: 32: 33:
34: var $mMakePreXCodeConvertTable = null;
35: 36: 37:
38: var $mMakePostXCodeConvertTable = null;
39: 40: 41: 42:
43: var $mXCodePre = null;
44: 45: 46: 47: 48: 49:
50: var $mMakeClickablePre = null;
51:
52:
53: var $mClickablePatterns = array();
54: var $mClickableReplacements = array();
55:
56: var $mXCodePatterns = array();
57: var $mXCodeReplacements = array();
58: var $mXCodeCheckImgPatterns = array();
59:
60: var $mPreXCodePatterns = array();
61: var $mPreXCodeReplacements = array();
62:
63: var $mPostXCodePatterns = array();
64: var $mPostXCodeReplacements = array();
65:
66: var $mSmileys = array();
67: var $mSmileysConvTable = array();
68:
69: 70: 71: 72: 73: 74:
75: function Legacy_TextFilter()
76: {
77: $obj = $this->mMakeClickableConvertTable = new XCube_Delegate;
78: $obj->register('Legacy_TextFilter.MakeClickableConvertTable');
79: $obj->add('Legacy_TextFilter::makeClickableConvertTable', XCUBE_DELEGATE_PRIORITY_2);
80:
81: $obj = $this->mMakeXCodeConvertTable = new XCube_Delegate;
82: $obj->register('Legacy_TextFilter.MakeXCodeConvertTable');
83: $obj->add('Legacy_TextFilter::makeXCodeConvertTable', XCUBE_DELEGATE_PRIORITY_2);
84:
85: $obj = $this->mMakeXCodeCheckImgPatterns = new XCube_Delegate;
86: $obj->register('Legacy_TextFilter.MakeXCodeCheckImgPatterns');
87: $obj->add('Legacy_TextFilter::makeXCodeCheckImgPatterns', XCUBE_DELEGATE_PRIORITY_2);
88:
89: $obj = $this->mMakePreXCodeConvertTable = new XCube_Delegate;
90: $obj->register('Legacy_TextFilter.MakePreXCodeConvertTable');
91: $obj->add('Legacy_TextFilter::makePreXCodeConvertTable', XCUBE_DELEGATE_PRIORITY_2);
92:
93: $obj = $this->mMakePostXCodeConvertTable = new XCube_Delegate;
94: $obj->register('Legacy_TextFilter.MakePostXCodeConvertTable');
95: $obj->add('Legacy_TextFilter::makePostXCodeConvertTable', XCUBE_DELEGATE_PRIORITY_2);
96:
97:
98:
99: $this->mMakeClickablePre = new XCube_Delegate();
100: $this->mMakeClickablePre->register('MyTextSanitizer.MakeClickablePre');
101:
102: $this->mXCodePre = new XCube_Delegate();
103: $this->mXCodePre->register('MyTextSanitizer.XoopsCodePre');
104: }
105:
106: function getInstance(&$instance) {
107: if (empty($instance)) {
108: $instance = new Legacy_TextFilter();
109: }
110: }
111:
112: 113: 114: 115: 116: 117: 118: 119:
120: function toShow($text, $x2comat=false) {
121: if ($x2comat) {
122:
123:
124:
125: return preg_replace(array("/&(#[0-9]+|#x[0-9a-f]+|[a-z]+[0-9]*);/i", "/ /i"), array('&\\1;', '&nbsp;'), htmlspecialchars($text, ENT_QUOTES));
126: } else {
127: return preg_replace("/&(#[0-9]+|#x[0-9a-f]+|[a-z]+[0-9]*);/i", '&\\1;', htmlspecialchars($text, ENT_QUOTES));
128: }
129: }
130:
131: 132: 133: 134: 135: 136: 137:
138: function toEdit($text) {
139: return preg_replace("/&(#0?[0-9]{4,6};)/i", '&$1', htmlspecialchars($text, ENT_QUOTES));
140: }
141:
142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153:
154: function toShowTarea($text, $html = 0, $smiley = 1, $xcode = 1, $image = 1, $br = 1, $x2comat=false) {
155: $text = $this->preConvertXCode($text, $xcode);
156: if ($html != 1) $text = $this->toShow($text, $x2comat);
157: $text = $this->makeClickable($text);
158: if ($smiley != 0) $text = $this->smiley($text);
159: if ($xcode != 0) $text = $this->convertXCode($text, $image);
160: if ($br != 0) $text = $this->nl2Br($text);
161: $text = $this->postConvertXCode($text, $xcode, $image);
162: return $text;
163: }
164:
165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176:
177: function toPreviewTarea($text, $html = 0, $smiley = 1, $xcode = 1, $image = 1, $br = 1, $x2comat=false)
178: {
179: return $this->toShowTarea($text, $html, $smiley, $xcode, $image, $br, $x2comat);
180: }
181:
182: 183: 184: 185: 186: 187: 188: 189: 190:
191: public function purifyHtml( $html, $encoding=null, $doctype=null)
192: {
193: require_once XOOPS_LIBRARY_PATH.'/htmlpurifier/library/HTMLPurifier.auto.php';
194: $encoding = $encoding ? $encoding : _CHARSET;
195: $doctypeArr = array("HTML 4.01 Strict","HTML 4.01 Transitional","XHTML 1.0 Strict","XHTML 1.0 Transitional","XHTML 1.1");
196:
197: $config = HTMLPurifier_Config::createDefault();
198: $config->set('Core.Encoding', $encoding);
199: if(in_array($doctype, $doctypeArr)){
200: $config->set('HTML.Doctype', $doctype);
201: }
202:
203: $purifier = new HTMLPurifier($config);
204: return $purifier->purify($html);
205: }
206:
207:
208: 209: 210: 211: 212:
213: function getSmileys() {
214: if (count($this->mSmileys) == 0) {
215: $this->mSmileysConvTable[0] = $this->mSmileysConvTable[1] = array();
216: $db =& Database::getInstance();
217: if ($getsmiles = $db->query("SELECT * FROM ".$db->prefix("smiles"))){
218: while ($smile = $db->fetchArray($getsmiles)) {
219: $this->mSmileys[] = $smile;
220: $this->mSmileysConvTable[0][] = $smile['code'];
221: $this->mSmileysConvTable[1][] = '<img src="'.XOOPS_UPLOAD_URL.'/'.htmlspecialchars($smile['smile_url']).'" alt="" />';
222: }
223: }
224: }
225: return $this->mSmileys;
226: }
227:
228: 229: 230: 231: 232: 233: 234:
235: function smiley($text) {
236: if (count($this->mSmileys) == 0) $this->getSmileys();
237: if (count($this->mSmileys) != 0) {
238: $text = str_replace($this->mSmileysConvTable[0], $this->mSmileysConvTable[1], $text);
239: }
240: return $text;
241: }
242:
243: 244: 245: 246: 247: 248:
249: function makeClickable($text) {
250: if (empty($this->mClickablePatterns)) {
251:
252:
253:
254:
255:
256:
257: $this->mMakeClickableConvertTable->call(new XCube_Ref($this->mClickablePatterns), new XCube_Ref($this->mClickableReplacements));
258:
259:
260:
261:
262:
263:
264:
265:
266:
267: $this->mMakeClickablePre->call(new XCube_Ref($this->mClickablePatterns), new XCube_Ref($this->mClickableReplacements));
268: }
269: $text = preg_replace($this->mClickablePatterns, $this->mClickableReplacements, $text);
270: return $text;
271: }
272:
273: function makeClickableConvertTable(&$patterns, &$replacements) {
274:
275: $hpath = "[-_.!~*\'()a-z0-9;\/?:\@&=+\$,%#]+";
276: $patterns[] = "/(^|[^]_a-z0-9-=\"'\/])([a-z]+?):\/\/($hpath)/i";
277: $replacements[] = "\\1<a href=\"\\2://\\3\" rel=\"external\">\\2://\\3</a>";
278: $patterns[] = "/(^|[^]_a-z0-9-=\"'\/])www\.([a-z0-9\-]+)\.($hpath)/i";
279: $replacements[] = "\\1<a href=\"http://www.\\2.\\3\" rel=\"external\">www.\\2.\\3</a>";
280: $patterns[] = "/(^|[^]_a-z0-9-=\"'\/])ftp\.([a-z0-9\-]+)\.($hpath)/i";
281: $replacements[] = "\\1<a href=\"ftp://ftp.\\2.\\3\" rel=\"external\">ftp.\\2.\\3</a>";
282: $patterns[] = "/(^|[^]_a-z0-9-=\"'\/:\.])([a-z0-9\-_\.]+?)@([a-z0-9!#\$%&'\*\+\-\/=\?^_\`{\|}~\.]+)/i";
283: $replacements[] = "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>";
284: }
285:
286: 287: 288: 289: 290: 291: 292: 293:
294: function convertXCode($text, $allowimage = 1) {
295: if (empty($this->mXCodePatterns)) {
296:
297:
298:
299:
300:
301:
302:
303:
304: $this->mMakeXCodeConvertTable->call(new XCube_Ref($this->mXCodePatterns), new XCube_Ref($this->mXCodeReplacements));
305:
306:
307:
308:
309:
310:
311:
312:
313:
314: $this->mXCodePre->call(new XCube_Ref($this->mXCodePatterns), new XCube_Ref($this->mXCodeReplacements[0]), 0);
315: $dummy = array();
316: $this->mXCodePre->call(new XCube_Ref($dummy), new XCube_Ref($this->mXCodeReplacements[1]), 1);
317: }
318: if (empty($this->mXCodeCheckImgPatterns)) {
319:
320:
321:
322:
323:
324:
325: $this->mMakeXCodeCheckImgPatterns->call(new XCube_Ref($this->mXCodeCheckImgPatterns));
326: }
327: $text = preg_replace_callback($this->mXCodeCheckImgPatterns, array($this, '_filterImgUrl'), $text);
328: $replacementsIdx = ($allowimage == 0) ? 0 : 1;
329: $text = preg_replace($this->mXCodePatterns, $this->mXCodeReplacements[$replacementsIdx], $text);
330: return $text;
331: }
332:
333: function makeXCodeCheckImgPatterns(&$patterns) {
334: $patterns[] = "/\[img( align=\w+)]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
335: }
336:
337: function makeXCodeConvertTable(&$patterns, &$replacements) {
338: $patterns[] = "/\[siteurl\=(['\"]?)([^\"'<>]*)\\1\](.*)\[\/siteurl\]/sU";
339: $replacements[0][] = $replacements[1][] = '<a href="'.XOOPS_URL.'/\\2" rel="external">\\3</a>';
340: $patterns[] = "/\[url\=(['\"]?)(http[s]?:\/\/[^\"'<>]*)\\1\](.*)\[\/url\]/sU";
341: $replacements[0][] = $replacements[1][] = '<a href="\\2" rel="external">\\3</a>';
342: $patterns[] = "/\[url\=(['\"]?)(ftp?:\/\/[^\"'<>]*)\\1\](.*)\[\/url\]/sU";
343: $replacements[0][] = $replacements[1][] = '<a href="\\2" rel="external">\\3</a>';
344: $patterns[] = "/\[url\=(['\"]?)([^\"'<>]*)\\1\](.*)\[\/url\]/sU";
345: $replacements[0][] = $replacements[1][] = '<a href="http://\\2" rel="external">\\3</a>';
346: $patterns[] = "/\[color\=(['\"]?)([a-zA-Z0-9]*)\\1\](.*)\[\/color\]/sU";
347: $replacements[0][] = $replacements[1][] = '<span style="color: #\\2;">\\3</span>';
348: $patterns[] = "/\[size\=(['\"]?)([a-z-]*)\\1\](.*)\[\/size\]/sU";
349: $replacements[0][] = $replacements[1][] = '<span style="font-size: \\2;">\\3</span>';
350: $patterns[] = "/\[font\=(['\"]?)([^;<>\*\(\)\"']*)\\1\](.*)\[\/font\]/sU";
351: $replacements[0][] = $replacements[1][] = '<span style="font-family: \\2;">\\3</span>';
352: $patterns[] = "/\[email\]([^;<>\*\(\)\"']*)\[\/email\]/sU";
353: $replacements[0][] = $replacements[1][] = '<a href="mailto:\\1">\\1</a>';
354: $patterns[] = "/\[b\](.*)\[\/b\]/sU";
355: $replacements[0][] = $replacements[1][] = '<b>\\1</b>';
356: $patterns[] = "/\[i\](.*)\[\/i\]/sU";
357: $replacements[0][] = $replacements[1][] = '<i>\\1</i>';
358: $patterns[] = "/\[u\](.*)\[\/u\]/sU";
359: $replacements[0][] = $replacements[1][] = '<u>\\1</u>';
360: $patterns[] = "/\[d\](.*)\[\/d\]/sU";
361: $replacements[0][] = $replacements[1][] = '<del>\\1</del>';
362: $patterns[] = "/\[img align\=(['\"]?)(left|center|right)\\1\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
363: $replacements[0][] = '<a href="\\3" rel="external">\\3</a>';
364: $replacements[1][] = '<img src="\\3" align="\\2" alt="" />';
365: $patterns[] = "/\[img\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
366: $replacements[0][] = '<a href="\\1" rel="external">\\1</a>';
367: $replacements[1][] = '<img src="\\1" alt="" />';
368: $patterns[] = "/\[img align\=(['\"]?)(left|center|right)\\1 id\=(['\"]?)([0-9]*)\\3\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
369: $replacements[0][] = '<a href="'.XOOPS_URL.'/image.php?id=\\4" rel="external">\\5</a>';
370: $replacements[1][] = '<img src="'.XOOPS_URL.'/image.php?id=\\4" align="\\2" alt="\\5" />';
371: $patterns[] = "/\[img id\=(['\"]?)([0-9]*)\\1\]([^\"\(\)\?\&'<>]*)\[\/img\]/sU";
372: $replacements[0][] = '<a href="'.XOOPS_URL.'/image.php?id=\\2" rel="external">\\3</a>';
373: $replacements[1][] = '<img src="'.XOOPS_URL.'/image.php?id=\\2" alt="\\3" />';
374: $patterns[] = "/\[quote\]/sU";
375: $replacements[0][] = $replacements[1][] = _QUOTEC.'<div class="xoopsQuote"><blockquote>';
376: $patterns[] = "/\[\/quote\]/sU";
377: $replacements[0][] = $replacements[1][] = '</blockquote></div>';
378: $patterns[] = "/javascript:/si";
379: $replacements[0][] = $replacements[1][] = "java script:";
380: $patterns[] = "/about:/si";
381: $replacements[0][] = $replacements[1][] = "about :";
382: }
383:
384: 385: 386: 387: 388: 389:
390: function _filterImgUrl($matches)
391: {
392: if ($this->_checkUrlString($matches[2])) {
393: return $matches[0];
394: } else {
395: return "";
396: }
397: }
398:
399: 400: 401: 402: 403: 404:
405: function _checkUrlString($text)
406: {
407:
408: if (preg_match('/[\x0-\x1f\x7f]/', $text)) {
409: return false;
410: }
411:
412: return !preg_match("/^(javascript|vbscript|about):/i", $text);
413: }
414:
415: 416: 417: 418: 419: 420: 421:
422: function nl2Br($text)
423: {
424: return preg_replace("/(\015\012)|(\015)|(\012)/","<br />",$text);
425: }
426:
427: 428: 429: 430: 431: 432: 433: 434: 435:
436: function preConvertXCode($text, $xcode = 1) {
437: if($xcode != 0){
438: if (empty($this->mPreXCodePatterns)) {
439:
440:
441:
442:
443:
444:
445: $this->mMakePreXCodeConvertTable->call(new XCube_Ref($this->mPreXCodePatterns), new XCube_Ref($this->mPreXCodeReplacements));
446: }
447: $text = preg_replace($this->mPreXCodePatterns, $this->mPreXCodeReplacements, $text);
448: }
449: return $text;
450: }
451:
452: function makePreXCodeConvertTable(&$patterns, &$replacements) {
453: $patterns[] = "/\[code\](.*)\[\/code\]/esU";
454: $replacements[] = "'[code]'.base64_encode('$1').'[/code]'";
455: }
456:
457: 458: 459: 460: 461: 462: 463: 464: 465: 466:
467: function postConvertXCode($text, $xcode=1, $image=1){
468: if($xcode != 0){
469: if (empty($this->mPostXCodePatterns)) {
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482: $this->mMakePostXCodeConvertTable->call(new XCube_Ref($this->mPostXCodePatterns), new XCube_Ref($this->mPostXCodeReplacements));
483: }
484: $replacementsIdx = ($image == 0) ? 0 : 1;
485: $text = preg_replace($this->mPostXCodePatterns, $this->mPostXCodeReplacements[$replacementsIdx], $text);
486: }
487: return $text;
488: }
489:
490: function makePostXCodeConvertTable(&$patterns, &$replacements) {
491: $patterns[] = "/\[code\](.*)\[\/code\]/esU";
492: $replacements[0][] = "'<div class=\"xoopsCode\"><pre><code>'.Legacy_TextFilter::codeSanitizer('$1', 0).'</code></pre></div>'";
493: $replacements[1][] = "'<div class=\"xoopsCode\"><pre><code>'.Legacy_TextFilter::codeSanitizer('$1', 1).'</code></pre></div>'";
494: }
495:
496: function codeSanitizer($text, $image = 1){
497: return $this->convertXCode(htmlspecialchars(str_replace('\"', '"', base64_decode($text)),ENT_QUOTES), $image);
498: }
499: }
500: ?>
501: