2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
2009-08-19 16:15:47 +03:00
|
|
|
|
require_once(Config::Get('path.root.engine').'/lib/external/Jevix/jevix.class.php');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Модуль обработки текста на основе типографа Jevix
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-03-21 15:48:00 +02:00
|
|
|
|
class LsText extends Module {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Объект типографа
|
|
|
|
|
*
|
|
|
|
|
* @var Jevix
|
|
|
|
|
*/
|
|
|
|
|
protected $oJevix;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Инициализация модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function Init() {
|
|
|
|
|
/**
|
|
|
|
|
* Создаем объект типографа и запускаем его конфигурацию
|
|
|
|
|
*/
|
|
|
|
|
$this->oJevix = new Jevix();
|
2009-08-19 16:15:47 +03:00
|
|
|
|
$this->JevixConfig();
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Конфигурирует типограф
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function JevixConfig() {
|
|
|
|
|
// Разрешённые теги
|
2009-05-05 23:00:08 +03:00
|
|
|
|
$this->oJevix->cfgAllowTags(array('cut','a', 'img', 'i', 'b', 'u', 's', 'video', 'em', 'strong', 'nobr', 'li', 'ol', 'ul', 'sup', 'abbr', 'sub', 'acronym', 'h4', 'h5', 'h6', 'br', 'hr', 'pre', 'code', 'object', 'param', 'embed', 'blockquote'));
|
2008-09-21 09:36:57 +03:00
|
|
|
|
// Коротие теги типа
|
|
|
|
|
$this->oJevix->cfgSetTagShort(array('br','img', 'hr', 'cut'));
|
|
|
|
|
// Преформатированные теги
|
2009-02-23 15:49:43 +02:00
|
|
|
|
$this->oJevix->cfgSetTagPreformatted(array('pre','code','video'));
|
2008-12-08 23:03:47 +02:00
|
|
|
|
// Разрешённые параметры тегов
|
|
|
|
|
$this->oJevix->cfgAllowTagParams('img', array('src', 'alt' => '#text', 'title', 'align' => array('right', 'left', 'center'), 'width' => '#int', 'height' => '#int', 'hspace' => '#int', 'vspace' => '#int'));
|
2009-04-11 15:07:29 +03:00
|
|
|
|
$this->oJevix->cfgAllowTagParams('a', array('title', 'href', 'rel'));
|
2008-10-25 23:31:29 +03:00
|
|
|
|
$this->oJevix->cfgAllowTagParams('cut', array('name'));
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$this->oJevix->cfgAllowTagParams('object', array('width' => '#int', 'height' => '#int', 'data' => '#link'));
|
|
|
|
|
$this->oJevix->cfgAllowTagParams('param', array('name' => '#text', 'value' => '#text'));
|
2009-04-04 14:38:30 +03:00
|
|
|
|
$this->oJevix->cfgAllowTagParams('embed', array('src' => '#image', 'type' => '#text','allowscriptaccess' => '#text', 'allowfullscreen' => '#text','width' => '#int', 'height' => '#int', 'flashvars'=> '#text', 'wmode'=> '#text'));
|
2008-10-25 23:31:29 +03:00
|
|
|
|
// Параметры тегов являющиеся обязательными
|
2008-09-21 09:36:57 +03:00
|
|
|
|
$this->oJevix->cfgSetTagParamsRequired('img', 'src');
|
|
|
|
|
$this->oJevix->cfgSetTagParamsRequired('a', 'href');
|
|
|
|
|
// Теги которые необходимо вырезать из текста вместе с контентом
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$this->oJevix->cfgSetTagCutWithContent(array('script', 'iframe', 'style'));
|
2008-09-21 09:36:57 +03:00
|
|
|
|
// Вложенные теги
|
|
|
|
|
$this->oJevix->cfgSetTagChilds('ul', array('li'), false, true);
|
|
|
|
|
$this->oJevix->cfgSetTagChilds('ol', array('li'), false, true);
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$this->oJevix->cfgSetTagChilds('object', 'param', false, true);
|
2009-02-22 13:43:07 +02:00
|
|
|
|
$this->oJevix->cfgSetTagChilds('object', 'embed', false, false);
|
2008-12-08 23:03:47 +02:00
|
|
|
|
// Если нужно оставлять пустые не короткие теги
|
|
|
|
|
$this->oJevix->cfgSetTagIsEmpty(array('param','embed'));
|
2009-06-12 12:49:03 +03:00
|
|
|
|
// Не нужна авто-расстановка <br>
|
2009-09-13 18:42:16 +03:00
|
|
|
|
$this->oJevix->cfgSetTagNoAutoBr(array('ul','ol','object'));
|
2009-04-04 14:38:30 +03:00
|
|
|
|
// Теги с обязательными параметрами
|
|
|
|
|
$this->oJevix->cfgSetTagParamsAutoAdd('embed',array(array('name'=>'wmode','value'=>'opaque','rewrite'=>true)));
|
2009-08-20 15:50:14 +03:00
|
|
|
|
if (Config::Get('view.noindex')) {
|
2009-04-11 15:07:29 +03:00
|
|
|
|
$this->oJevix->cfgSetTagParamsAutoAdd('a',array(array('name'=>'rel','value'=>'nofollow','rewrite'=>true)));
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
// Отключение авто-добавления <br>
|
2009-06-12 12:49:03 +03:00
|
|
|
|
$this->oJevix->cfgSetAutoBrMode(true);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
// Автозамена
|
|
|
|
|
$this->oJevix->cfgSetAutoReplace(array('+/-', '(c)', '(r)', '(C)', '(R)'), array('±', '©', '®', '©', '®'));
|
|
|
|
|
//$this->oJevix->cfgSetXHTMLMode(false);
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$this->oJevix->cfgSetTagNoTypography('code');
|
2009-02-23 15:49:43 +02:00
|
|
|
|
$this->oJevix->cfgSetTagNoTypography('video');
|
2009-09-13 18:42:16 +03:00
|
|
|
|
$this->oJevix->cfgSetTagNoTypography('object');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Парсинг текста с помощью Jevix
|
|
|
|
|
*
|
|
|
|
|
* @param string $sText
|
|
|
|
|
* @param array $aError
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function JevixParser($sText,&$aError=null) {
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$sResult=$this->oJevix->parse($sText,$aError);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
return $sResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Парсинг текста на предмет видео
|
|
|
|
|
*
|
|
|
|
|
* @param string $sText
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2009-09-13 18:42:16 +03:00
|
|
|
|
public function VideoParser($sText) {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* youtube.com
|
2009-04-10 17:02:57 +03:00
|
|
|
|
*/
|
|
|
|
|
$sText = preg_replace('/<video>http:\/\/(?:www\.|)youtube\.com\/watch\?v=([a-zA-Z0-9_\-]+)<\/video>/Ui', '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/$1&hl=en"></param><param name="wmode" value="opaque"></param><embed src="http://www.youtube.com/v/$1&hl=en" type="application/x-shockwave-flash" wmode="opaque" width="425" height="344"></embed></object>', $sText);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* rutube.ru
|
2009-04-10 17:02:57 +03:00
|
|
|
|
*/
|
|
|
|
|
$sText = preg_replace('/<video>http:\/\/(?:www\.|)rutube.ru\/tracks\/\d+.html\?v=([a-zA-Z0-9_\-]+)<\/video>/Ui', '<OBJECT width="470" height="353"><PARAM name="movie" value="http://video.rutube.ru/$1"></PARAM><PARAM name="wmode" value="opaque"></PARAM><PARAM name="allowFullScreen" value="true"></PARAM><PARAM name="flashVars" value="uid=662118"></PARAM><EMBED src="http://video.rutube.ru/$1" type="application/x-shockwave-flash" wmode="opaque" width="470" height="353" allowFullScreen="true" flashVars="uid=662118"></EMBED></OBJECT>', $sText);
|
|
|
|
|
return $sText;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
2009-08-18 12:10:14 +03:00
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Парсит текст
|
|
|
|
|
*
|
|
|
|
|
* @param string $sText
|
|
|
|
|
*/
|
|
|
|
|
public function Parser($sText) {
|
2009-03-28 00:36:59 +02:00
|
|
|
|
$sResult=$this->FlashParamParser($sText);
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$sResult=$this->JevixParser($sResult);
|
2009-08-18 12:10:14 +03:00
|
|
|
|
$sResult=$this->VideoParser($sResult);
|
2009-01-13 23:13:36 +02:00
|
|
|
|
$sResult=$this->CodeSourceParser($sResult);
|
2009-08-19 16:15:47 +03:00
|
|
|
|
if (Config::Get('view.noindex')) {
|
2009-03-27 22:53:09 +02:00
|
|
|
|
// требует доработки, т.к. обрабатывает ВСЕ ссылки, включая в <code></code>
|
|
|
|
|
$sResult=$this->MakeUrlNoIndex($sResult);
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
return $sResult;
|
|
|
|
|
}
|
2008-12-08 23:03:47 +02:00
|
|
|
|
/**
|
|
|
|
|
* Заменяет все вхождения короткого тега <param/> на длиную версию <param></param>
|
2009-02-22 22:45:21 +02:00
|
|
|
|
* Заменяет все вхождения короткого тега <embed/> на длиную версию <embed></embed>
|
2008-12-08 23:03:47 +02:00
|
|
|
|
*
|
|
|
|
|
*/
|
2009-03-28 00:36:59 +02:00
|
|
|
|
protected function FlashParamParser($sText) {
|
|
|
|
|
if (preg_match_all("@(<\s*param\s*name\s*=\s*\".*\"\s*value\s*=\s*\".*\")\s*/?\s*>(?!</param>)@Ui",$sText,$aMatch)) {
|
2008-12-08 23:03:47 +02:00
|
|
|
|
foreach ($aMatch[1] as $key => $str) {
|
|
|
|
|
$str_new=$str.'></param>';
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
|
|
|
|
|
}
|
2009-02-22 22:45:21 +02:00
|
|
|
|
}
|
2009-03-28 00:36:59 +02:00
|
|
|
|
if (preg_match_all("@(<\s*embed\s*.*)\s*/?\s*>(?!</embed>)@Ui",$sText,$aMatch)) {
|
2009-02-22 22:45:21 +02:00
|
|
|
|
foreach ($aMatch[1] as $key => $str) {
|
|
|
|
|
$str_new=$str.'></embed>';
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
|
|
|
|
|
}
|
2009-04-10 17:02:57 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Удаляем все <param name="wmode" value="*"></param>
|
|
|
|
|
*/
|
|
|
|
|
if (preg_match_all("@(<param\s.*name=\"wmode\".*>\s*</param>)@Ui",$sText,$aMatch)) {
|
|
|
|
|
foreach ($aMatch[1] as $key => $str) {
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],'',$sText);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* А теперь после <object> добавляем <param name="wmode" value="opaque"></param>
|
|
|
|
|
* Решение не фантан, но главное работает :)
|
|
|
|
|
*/
|
|
|
|
|
if (preg_match_all("@(<object\s.*>)@Ui",$sText,$aMatch)) {
|
|
|
|
|
foreach ($aMatch[1] as $key => $str) {
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],$aMatch[0][$key].'<param name="wmode" value="opaque"></param>',$sText);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-08 23:03:47 +02:00
|
|
|
|
return $sText;
|
|
|
|
|
}
|
2009-01-13 23:13:36 +02:00
|
|
|
|
|
|
|
|
|
public function CodeSourceParser($sText) {
|
2009-02-22 14:53:44 +02:00
|
|
|
|
$sText=str_replace("<code>",'<pre class="prettyprint"><code>',$sText);
|
2009-01-13 23:13:36 +02:00
|
|
|
|
$sText=str_replace("</code>",'</code></pre>',$sText);
|
|
|
|
|
return $sText;
|
|
|
|
|
}
|
2009-03-27 22:53:09 +02:00
|
|
|
|
/**
|
|
|
|
|
* Делает ссылки не видимыми для поисковиков
|
|
|
|
|
*
|
|
|
|
|
* @param unknown_type $sText
|
|
|
|
|
* @return unknown
|
|
|
|
|
*/
|
|
|
|
|
public function MakeUrlNoIndex($sText) {
|
|
|
|
|
return preg_replace("/(<a .*>.*<\/a>)/Ui","<noindex>$1</noindex>",$sText);
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
?>
|