ModuleText

Package framework.modules
Inheritance class ModuleText » Module » LsObject
Since 1.0
Source Code /framework/classes/modules/text/Text.class.php
Модуль обработки текста на основе типографа Jevix Позволяет вырезать из текста лишние HTML теги и предотвращает различные попытки внедрить в текст JavaScript
$sText=$this->Text_Parser($sTestSource);
Настройки парсинга находятся в конфиге /config/jevix.php

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBehaviors array Список поведений LsObject
aParams array Дополнительные параметры, которые необходимо учитывать при обработке текста ModuleText
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oJevix Jevix Объект типографа ModuleText

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddBehaviorHook() Добавляет хук поведения LsObject
AddParams() Добавляет параметры ModuleText
AttachBehavior() Присоединяет поведение к объекту LsObject
CodeSourceParser() Подсветка исходного кода ModuleText
Cut() Производить резрезание текста по тегу cut. ModuleText
DetachBehavior() Отсоединяет поведение от объекта LsObject
GetBehavior() Возвращает объект поведения по его имени LsObject
GetBehaviors() Возвращает все объекты поведения LsObject
GetJevix() Возвращает объект Jevix ModuleText
GetParam() Возвращает параметр по имени или сразу все параметры ModuleText
Init() Инициализация модуля ModuleText
JevixParser() Парсинг текста с помощью Jevix ModuleText
LoadJevixConfig() Загружает конфиг Jevix'а ModuleText
Parser() Парсит текст, применя все парсеры ModuleText
RemoveBehaviorHook() Удаляет хук поведения LsObject
RemoveParams() Удаляет параметры ModuleText
RunBehaviorHook() Запускает хук поведения на выполнение LsObject
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
VideoParser() Парсинг текста на предмет видео ModuleText
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля LsObject
__clone() Блокируем копирование/клонирование объекта Module
__construct() Конструктор, запускается автоматически при создании объекта LsObject
__get() Обработка доступа к объекты поведения LsObject
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
FlashParamParser() Заменяет все вхождения короткого тега на длиную версию ModuleText
JevixConfig() Конфигурирует типограф ModuleText
PrepareBehaviors() Инициализация поведений LsObject

Property Details

aParams property
protected array $aParams;

Дополнительные параметры, которые необходимо учитывать при обработке текста Можно задавать произвольные параметры, главное чтобы логика обработки текста их учитывала Желеательно после установки параметров и выполнения обработки эти параметры сбросить методом

See Also

  • ModuleText::AddExecHook
oJevix property
protected Jevix $oJevix;

Объект типографа

Method Details

AddParams() method
public void AddParams($aParams $aParams)
$aParams $aParams
Source Code: /framework/classes/modules/text/Text.class.php#125 (show)
public function AddParams($aParams)
{
    
$this->aParams array_merge($this->aParams$aParams);
}

Добавляет параметры

CodeSourceParser() method
public mixed CodeSourceParser(string $sText)
$sText string Исходный текст
{return} mixed
Source Code: /framework/classes/modules/text/Text.class.php#300 (show)
public function CodeSourceParser($sText)
{
    
$sText str_replace("<code>"'<pre class="prettyprint">'$sText);
    
$sText str_replace("</code>"'</pre>'$sText);
    
$sText str_replace("<codeline>"'<code class="prettyprint">'$sText);
    
$sText str_replace("</codeline>"'</code>'$sText);
    return 
$sText;
}

Подсветка исходного кода

Cut() method
public array Cut(string $sText)
$sText string Исходный текст
{return} array
Source Code: /framework/classes/modules/text/Text.class.php#323 (show)
public function Cut($sText)
{
    
$sTextShort $sText;
    
$sTextNew $sText;
    
$sTextCut null;

    
$sTextTemp str_replace("\r\n"'[<rn>]'$sText);
    
$sTextTemp str_replace("\n"'[<n>]'$sTextTemp);

    if (
preg_match("/^(.*)<cut(.*)>(.*)$/Ui"$sTextTemp$aMatch)) {
        
$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]);
        
$aMatch[3] = str_replace('[<n>]'"\r\n"$aMatch[3]);
        
$sTextShort $aMatch[1];
        
$sTextNew $aMatch[1] . ' <a name="cut"></a> ' $aMatch[3];
        if (
preg_match('/^\s*name\s*=\s*"(.+)"\s*\/?$/Ui'$aMatch[2], $aMatchCut)) {
            
$sTextCut trim($aMatchCut[1]);
        }
    }

    return array(
$sTextShort$sTextNew$sTextCut htmlspecialchars($sTextCut) : null);
}

Производить резрезание текста по тегу cut. Возвращаем массив вида:

array(
       $sTextShort - текст до тега <cut>
       $sTextNew   - весь текст за исключением удаленного тега
       $sTextCut   - именованное значение <cut>
)

FlashParamParser() method
protected string FlashParamParser(string $sText)
$sText string Исходный текст
{return} string
Source Code: /framework/classes/modules/text/Text.class.php#258 (show)
protected function FlashParamParser($sText)
{
    if (
preg_match_all("@(<\s*param\s*name\s*=\s*(?:\"|').*(?:\"|')\s*value\s*=\s*(?:\"|').*(?:\"|'))\s*/?\s*>(?!</param>)@Ui",
        
$sText$aMatch)) {
        foreach (
$aMatch[1] as $key => $str) {
            
$str_new $str '></param>';
            
$sText str_replace($aMatch[0][$key], $str_new$sText);
        }
    }
    if (
preg_match_all("@(<\s*embed\s*.*)\s*/?\s*>(?!</embed>)@Ui"$sText$aMatch)) {
        foreach (
$aMatch[1] as $key => $str) {
            
$str_new $str '></embed>';
            
$sText str_replace($aMatch[0][$key], $str_new$sText);
        }
    }
    
/**
     * Удаляем все <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);
        }
    }
    return 
$sText;
}

Заменяет все вхождения короткого тега на длиную версию Заменяет все вхождения короткого тега на длиную версию

GetJevix() method
public Jevix GetJevix()
{return} Jevix
Source Code: /framework/classes/modules/text/Text.class.php#115 (show)
public function GetJevix()
{
    return 
$this->oJevix;
}

Возвращает объект Jevix

GetParam() method
public array|mixed GetParam(string|null $sName=NULL)
$sName string|null Если null, то вернет массив всех параметров
{return} array|mixed
Source Code: /framework/classes/modules/text/Text.class.php#137 (show)
public function GetParam($sName null)
{
    if (
is_null($sName)) {
        return 
$this->aParams;
    }
    if (isset(
$this->aParams[$sName])) {
        return 
$this->aParams[$sName];
    }
    return 
null;
}

Возвращает параметр по имени или сразу все параметры

Init() method
public void Init()
Source Code: /framework/classes/modules/text/Text.class.php#57 (show)
public function Init()
{
    
/**
     * Создаем объект типографа и запускаем его конфигурацию
     */
    
$this->oJevix = new Jevix();
    
$this->JevixConfig();
}

Инициализация модуля

JevixConfig() method
protected void JevixConfig()
Source Code: /framework/classes/modules/text/Text.class.php#70 (show)
protected function JevixConfig()
{
    
// загружаем конфиг
    
$this->LoadJevixConfig();
}

Конфигурирует типограф

JevixParser() method
public string JevixParser(string $sText, array &$aError=NULL)
$sText string Исходный текст
$aError array Возвращает список возникших ошибок
{return} string
Source Code: /framework/classes/modules/text/Text.class.php#173 (show)
public function JevixParser($sText, &$aError null)
{
    
// Если конфиг пустой, то загружаем его
    
if (!count($this->oJevix->tagsRules)) {
        
$this->LoadJevixConfig();
    }
    
$sResult $this->oJevix->parse($sText$aError);
    return 
$sResult;
}

Парсинг текста с помощью Jevix

LoadJevixConfig() method
public void LoadJevixConfig(string $sType='default', bool $bClear=true)
$sType string Тип конфига
$bClear bool Очищать предыдущий конфиг или нет
Source Code: /framework/classes/modules/text/Text.class.php#82 (show)
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) {
                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;
                    }
                }
                
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);
        }
    }
}

Загружает конфиг Jevix'а

Parser() method
public string Parser(string $sText)
$sText string Исходный текст
{return} string
Source Code: /framework/classes/modules/text/Text.class.php#239 (show)
public function Parser($sText)
{
    if (!
is_string($sText)) {
        return 
'';
    }
    
$sResult $this->FlashParamParser($sText);
    
$sResult $this->JevixParser($sResult);
    
$sResult $this->VideoParser($sResult);
    
$sResult $this->CodeSourceParser($sResult);
    return 
$sResult;
}

Парсит текст, применя все парсеры

RemoveParams() method
public void RemoveParams(array|string|null $aNames=NULL)
$aNames array|string|null Название параметра или список названий параметров. Если null, то удалятся все параметры
Source Code: /framework/classes/modules/text/Text.class.php#153 (show)
public function RemoveParams($aNames null)
{
    if (
is_null($aNames)) {
        
$this->aParams = array();
    }
    if (!
is_array($aNames)) {
        
$aNames = array($aNames);
    }
    foreach (
$aNames as $sName) {
        unset(
$this->aParams[$sName]);
    }
}

Удаляет параметры

VideoParser() method
public string VideoParser(string $sText)
$sText string Исходный текст
{return} string
Source Code: /framework/classes/modules/text/Text.class.php#190 (show)
public function VideoParser($sText)
{
    
/**
     * youtu.be
     */
    
$sText preg_replace('/<video>http:\/\/(?:www\.|)youtu.be\/([a-zA-Z0-9_\-]+)(&.+)?<\/video>/Ui',
        
'<iframe width="560" height="315" src="http://www.youtube.com/embed/$1?rel=0" frameborder="0" allowfullscreen></iframe>',
        
$sText);
    
/**
     * youtube.com
     */
    
$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);
    
/**
     * rutube.ru
     */
    
$sText preg_replace('/<video>http:\/\/(?:www\.|)rutube\.ru\/tracks\/(\d+)\.html.*<\/video>/Ui',
        
'<iframe width="720" height="405" src="//rutube.ru/play/embed/$1" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>',
        
$sText);
    
$sText preg_replace('/<video>http:\/\/(?:www\.|)rutube\.ru\/video\/([a-zA-Z0-9_\-]+)\/?<\/video>/Ui',
        
'<iframe width="720" height="405" src="//rutube.ru/play/embed/$1" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>',
        
$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);
    
/**
     * vk.com
     */
    
$sText preg_replace('/<video>(http:\/\/(?:www\.|)vk\.com\/video_ext\.php.*)<\/video>/i',
        
'<iframe src="$1" width="607" height="360" frameborder="0"></iframe>'$sText);
    return 
$sText;
}

Парсинг текста на предмет видео Находит теги

<video></video>
и реобразовываетих в видео