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
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
2013-08-08 14:00:37 +03:00
|
|
|
|
require_once(Config::Get('path.framework.libs_vendor.server').'/Jevix/jevix.class.php');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Модуль обработки текста на основе типографа Jevix
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Позволяет вырезать из текста лишние HTML теги и предотвращает различные попытки внедрить в текст JavaScript
|
|
|
|
|
* <pre>
|
|
|
|
|
* $sText=$this->Text_Parser($sTestSource);
|
|
|
|
|
* </pre>
|
|
|
|
|
* Настройки парсинга находятся в конфиге /config/jevix.php
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @package engine.modules
|
|
|
|
|
* @since 1.0
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
2010-05-27 17:02:43 +03:00
|
|
|
|
class ModuleText extends Module {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Объект типографа
|
|
|
|
|
*
|
|
|
|
|
* @var Jevix
|
|
|
|
|
*/
|
2012-04-27 13:23:02 +03:00
|
|
|
|
protected $oJevix;
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализация модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
2012-04-27 13:23:02 +03:00
|
|
|
|
public function Init() {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Создаем объект типографа и запускаем его конфигурацию
|
|
|
|
|
*/
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$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() {
|
2011-04-26 17:52:22 +03:00
|
|
|
|
// загружаем конфиг
|
|
|
|
|
$this->LoadJevixConfig();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Загружает конфиг Jevix'а
|
|
|
|
|
*
|
|
|
|
|
* @param string $sType Тип конфига
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param bool $bClear Очищать предыдущий конфиг или нет
|
2011-04-26 17:52:22 +03:00
|
|
|
|
*/
|
|
|
|
|
public function LoadJevixConfig($sType='default',$bClear=true) {
|
|
|
|
|
if ($bClear) {
|
|
|
|
|
$this->oJevix->tagsRules=array();
|
|
|
|
|
}
|
|
|
|
|
$aConfig=Config::Get('jevix.'.$sType);
|
|
|
|
|
if (is_array($aConfig)) {
|
|
|
|
|
foreach ($aConfig as $sMethod => $aExec) {
|
|
|
|
|
foreach ($aExec as $aParams) {
|
2011-08-25 11:10:20 +03:00
|
|
|
|
if (in_array(strtolower($sMethod),array_map("strtolower",array('cfgSetTagCallbackFull','cfgSetTagCallback')))) {
|
|
|
|
|
if (isset($aParams[1][0]) and $aParams[1][0]=='_this_') {
|
|
|
|
|
$aParams[1][0]=$this;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-04-26 17:52:22 +03:00
|
|
|
|
call_user_func_array(array($this->oJevix,$sMethod), $aParams);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Хардкодим некоторые параметры
|
|
|
|
|
*/
|
|
|
|
|
unset($this->oJevix->entities1['&']); // разрешаем в параметрах символ &
|
|
|
|
|
if (Config::Get('view.noindex') and isset($this->oJevix->tagsRules['a'])) {
|
|
|
|
|
$this->oJevix->cfgSetTagParamDefault('a','rel','nofollow',true);
|
|
|
|
|
}
|
2009-04-11 15:07:29 +03:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
2011-04-26 17:52:22 +03:00
|
|
|
|
/**
|
|
|
|
|
* Возвращает объект Jevix
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @return Jevix
|
2011-04-26 17:52:22 +03:00
|
|
|
|
*/
|
|
|
|
|
public function GetJevix() {
|
|
|
|
|
return $this->oJevix;
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Парсинг текста с помощью Jevix
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sText Исходный текст
|
|
|
|
|
* @param array $aError Возвращает список возникших ошибок
|
2008-09-21 09:36:57 +03:00
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2011-04-26 17:52:22 +03:00
|
|
|
|
public function JevixParser($sText,&$aError=null) {
|
|
|
|
|
// Если конфиг пустой, то загружаем его
|
|
|
|
|
if (!count($this->oJevix->tagsRules)) {
|
|
|
|
|
$this->LoadJevixConfig();
|
|
|
|
|
}
|
2008-12-08 23:03:47 +02:00
|
|
|
|
$sResult=$this->oJevix->parse($sText,$aError);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
return $sResult;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Парсинг текста на предмет видео
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Находит теги <pre><video></video></pre> и реобразовываетих в видео
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sText Исходный текст
|
2008-09-21 09:36:57 +03:00
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2009-09-13 18:42:16 +03:00
|
|
|
|
public function VideoParser($sText) {
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* youtube.com
|
2012-04-27 13:23:02 +03:00
|
|
|
|
*/
|
2012-06-10 17:28:03 +03:00
|
|
|
|
$sText = preg_replace('/<video>http:\/\/(?:www\.|)youtube\.com\/watch\?v=([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui', '<iframe width="560" height="315" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $sText);
|
|
|
|
|
/**
|
|
|
|
|
* vimeo.com
|
|
|
|
|
*/
|
|
|
|
|
$sText = preg_replace('/<video>http:\/\/(?:www\.|)vimeo\.com\/(\d+).*<\/video>/i', '<iframe src="http://player.vimeo.com/video/$1" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>', $sText);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* rutube.ru
|
2012-04-27 13:23:02 +03:00
|
|
|
|
*/
|
2012-06-10 17:28:03 +03:00
|
|
|
|
$sText = preg_replace('/<video>http:\/\/(?:www\.|)rutube\.ru\/tracks\/(\d+)\.html.*<\/video>/Ui', '<OBJECT width="470" height="353"><PARAM name="movie" value="http://video.rutube.ru/$1"></PARAM><PARAM name="wmode" value="window"></PARAM><PARAM name="allowFullScreen" value="true"></PARAM><EMBED src="http://video.rutube.ru/$1" type="application/x-shockwave-flash" wmode="window" width="470" height="353" allowFullScreen="true" ></EMBED></OBJECT>', $sText);
|
|
|
|
|
/**
|
|
|
|
|
* video.yandex.ru
|
|
|
|
|
*/
|
|
|
|
|
$sText = preg_replace('/<video>http:\/\/video\.yandex\.ru\/users\/([a-zA-Z0-9_\-]+)\/view\/(\d+).*<\/video>/i', '<object width="467" height="345"><param name="video" value="http://video.yandex.ru/users/$1/view/$2/get-object-by-url/redirect"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="noscale"></param><embed src="http://video.yandex.ru/users/$1/view/$2/get-object-by-url/redirect" type="application/x-shockwave-flash" width="467" height="345" allowFullScreen="true" scale="noscale" ></embed></object>', $sText);
|
2009-04-10 17:02:57 +03:00
|
|
|
|
return $sText;
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Парсит текст, применя все парсеры
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sText Исходный текст
|
|
|
|
|
* @return string
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
|
|
|
|
public function Parser($sText) {
|
2012-07-08 11:50:36 +03:00
|
|
|
|
if (!is_string($sText)) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$sResult=$this->FlashParamParser($sText);
|
|
|
|
|
$sResult=$this->JevixParser($sResult);
|
|
|
|
|
$sResult=$this->VideoParser($sResult);
|
2009-01-13 23:13:36 +02:00
|
|
|
|
$sResult=$this->CodeSourceParser($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>
|
2012-04-27 13:23:02 +03:00
|
|
|
|
*
|
|
|
|
|
* @param string $sText Исходный текст
|
|
|
|
|
* @return string
|
2008-12-08 23:03:47 +02:00
|
|
|
|
*/
|
2012-04-27 13:23:02 +03: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) {
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$str_new=$str.'></param>';
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
|
|
|
|
|
}
|
2009-02-22 22:45:21 +02:00
|
|
|
|
}
|
2012-04-27 13:23:02 +03: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) {
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$str_new=$str.'></embed>';
|
|
|
|
|
$sText=str_replace($aMatch[0][$key],$str_new,$sText);
|
|
|
|
|
}
|
|
|
|
|
}
|
2009-04-10 17:02:57 +03:00
|
|
|
|
/**
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Удаляем все <param name="wmode" value="*"></param>
|
2009-04-10 17:02:57 +03:00
|
|
|
|
*/
|
2010-07-07 09:06:37 +03:00
|
|
|
|
if (preg_match_all("@(<param\s.*name=(?:\"|')wmode(?:\"|').*>\s*</param>)@Ui",$sText,$aMatch)) {
|
2009-04-10 17:02:57 +03:00
|
|
|
|
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;
|
|
|
|
|
}
|
2012-04-27 13:23:02 +03:00
|
|
|
|
/**
|
|
|
|
|
* Подсветка исходного кода
|
|
|
|
|
*
|
|
|
|
|
* @param string $sText Исходный текст
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
2009-01-13 23:13:36 +02:00
|
|
|
|
public function CodeSourceParser($sText) {
|
2013-01-08 02:21:05 +02:00
|
|
|
|
$sText=str_replace("<code>",'<pre class="prettyprint">',$sText);
|
|
|
|
|
$sText=str_replace("</code>",'</pre>',$sText);
|
2013-01-16 13:21:07 +02:00
|
|
|
|
$sText=str_replace("<codeline>",'<code class="prettyprint">',$sText);
|
|
|
|
|
$sText=str_replace("</codeline>",'</code>',$sText);
|
2009-01-13 23:13:36 +02:00
|
|
|
|
return $sText;
|
|
|
|
|
}
|
2009-11-24 01:11:16 +02:00
|
|
|
|
/**
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Производить резрезание текста по тегу cut.
|
2009-11-24 01:11:16 +02:00
|
|
|
|
* Возвращаем массив вида:
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* <pre>
|
2009-11-24 01:11:16 +02:00
|
|
|
|
* array(
|
|
|
|
|
* $sTextShort - текст до тега <cut>
|
|
|
|
|
* $sTextNew - весь текст за исключением удаленного тега
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* $sTextCut - именованное значение <cut>
|
2009-11-24 01:11:16 +02:00
|
|
|
|
* )
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* </pre>
|
2009-11-24 01:11:16 +02:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sText Исходный текст
|
2009-11-24 01:11:16 +02:00
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function Cut($sText) {
|
|
|
|
|
$sTextShort = $sText;
|
|
|
|
|
$sTextNew = $sText;
|
|
|
|
|
$sTextCut = null;
|
2012-04-27 13:23:02 +03:00
|
|
|
|
|
2010-05-18 16:36:32 +03:00
|
|
|
|
$sTextTemp=str_replace("\r\n",'[<rn>]',$sText);
|
2009-11-24 01:11:16 +02:00
|
|
|
|
$sTextTemp=str_replace("\n",'[<n>]',$sTextTemp);
|
2012-04-27 13:23:02 +03:00
|
|
|
|
|
|
|
|
|
if (preg_match("/^(.*)<cut(.*)>(.*)$/Ui",$sTextTemp,$aMatch)) {
|
2009-11-24 01:11:16 +02:00
|
|
|
|
$aMatch[1]=str_replace('[<rn>]',"\r\n",$aMatch[1]);
|
|
|
|
|
$aMatch[1]=str_replace('[<n>]',"\r\n",$aMatch[1]);
|
|
|
|
|
$aMatch[3]=str_replace('[<rn>]',"\r\n",$aMatch[3]);
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$aMatch[3]=str_replace('[<n>]',"\r\n",$aMatch[3]);
|
2010-05-18 16:36:32 +03:00
|
|
|
|
$sTextShort=$aMatch[1];
|
2010-07-10 10:21:51 +03:00
|
|
|
|
$sTextNew=$aMatch[1].' <a name="cut"></a> '.$aMatch[3];
|
2012-04-27 13:23:02 +03:00
|
|
|
|
if (preg_match('/^\s*name\s*=\s*"(.+)"\s*\/?$/Ui',$aMatch[2],$aMatchCut)) {
|
2009-11-24 01:11:16 +02:00
|
|
|
|
$sTextCut=trim($aMatchCut[1]);
|
2012-04-27 13:23:02 +03:00
|
|
|
|
}
|
2009-11-24 01:11:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-04-06 12:27:50 +03:00
|
|
|
|
return array($sTextShort,$sTextNew,$sTextCut ? htmlspecialchars($sTextCut) : null);
|
2009-11-24 01:11:16 +02:00
|
|
|
|
}
|
2011-08-25 11:10:20 +03:00
|
|
|
|
/**
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Обработка тега ls в тексте
|
|
|
|
|
* <pre>
|
|
|
|
|
* <ls user="admin" />
|
|
|
|
|
* </pre>
|
2011-08-25 11:10:20 +03:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sTag Тег на ктором сработал колбэк
|
|
|
|
|
* @param array $aParams Список параметров тега
|
|
|
|
|
* @return string
|
2011-08-25 11:10:20 +03:00
|
|
|
|
*/
|
|
|
|
|
public function CallbackTagLs($sTag,$aParams) {
|
|
|
|
|
$sText='';
|
|
|
|
|
if (isset($aParams['user'])) {
|
|
|
|
|
if ($oUser=$this->User_getUserByLogin($aParams['user'])) {
|
|
|
|
|
$sText.="<a href=\"{$oUser->getUserWebPath()}\" class=\"ls-user\">{$oUser->getLogin()}</a> ";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $sText;
|
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
?>
|