Исправление ошибки парсера, когда тот исправлял (C), (R) и т.п. внутри тега code

FAQ
Проблема

заменяет все вхождения, указанные в конфиге

// Автозамена
'cfgSetAutoReplace' => array(
  array(
    array('+/-', '(c)', '(с)', '(r)', '(C)', '(С)', '(R)'),
    array('±', '©', '©', '®', '©', '©', '®')
  )
),

даже внутри преформатированного тега
<code />
где делать этого не нужно. Эта проблема существует с момента создания парсера и довольно таки уже давно.

Решение

Нужно найти в файле jevix.class.php метод
function parse($text, &$errors)
в котором удалить строки:

if(!empty($this->autoReplace)){
  $this->text = str_ireplace($this->autoReplace['from'], $this->autoReplace['to'], $this->text);
}

после этого в конце метода
protected function anyThing(&$content = '', $parentTag = null)
найти строки:

// Текст
} elseif($this->text($text)){
  $content.=$text;
}

и заменить их на:

// Текст
} elseif($this->text($text)){
  /**
   * Исправление работы автозамены (cfgSetAutoReplace) на корректную
   *
   * fix by Serge Pustovit (PSNet) <light.feel@gmail.com> http://psnet.lookformp3.net
   * @link https://github.com/livestreet/livestreet-framework/issues/62
   */
  if(!empty($this->autoReplace)){
    $text = str_ireplace($this->autoReplace['from'], $this->autoReplace['to'], $text);
  }
  $content.=$text;
}

Результат

Отныне проблема решена. Ура. Существовала она более 7 лет.

Что произошло

Мы научили парсер обрабатывать только просто текст и текст внутри тегов, но аккуратно, а не весь текст в целом, как было раньше. К тому же парсер не будет ломать теги, если в значениях их атрибутов или вообще в их составе будут содержаться возможные замены. Раньше парсер это делал.

Нюансы

Автозамена не будет работать в:

  • преформатированных тегах
    
    // Преформатированные теги
    'cfgSetTagPreformatted' => array(
      array(
        array('pre','code','video')
      ),
    ),
    

  • в тегах, на которые повешен обычный колбек (cfgSetTagCallback) или полный (cfgSetTagCallbackFull)
    
    'cfgSetTagCallbackFull' => array(
      array(
        'ls',
        array('_this_','CallbackTagLs'),
      ),
    ),
    


Но в этих тегах замена и не нужна вовсе, исходя из их назначения.

Проверка

Проверочный текст:

Текст (C) здесь
<code>Больше текста внутри (C) кода (R) знаки +/-</code>
Некоторый (R) текст после

<blockquote>Тест тегов (C) внутри +/- другого (R) тега</blockquote>

<ol>
    <li>Проверка вложенных (R) тегов (C)</li>
</ol>

<a href="#test" title="У нас тут свой (С)">Ссылка, в которой раньше парсер покопался бы</a>

теперь будет отображаться корректно:

Текст © здесь
<pre class="prettyprint"><code>Больше текста внутри (C) кода (R) знаки +/-</code></pre>
Некоторый ® текст после

<blockquote>Тест тегов © внутри ± другого ® тега</blockquote>
<ol><li>Проверка вложенных ® тегов ©</li></ol>
<a rel="nofollow" title="У нас тут свой (С)" href="#test">Ссылка, в которой раньше парсер покопался бы</a>

а не так, как раньше:

Текст © здесь
<pre class="prettyprint"><code>Больше текста внутри © кода ® знаки ±</code></pre>
Некоторый ® текст после

<blockquote>Тест тегов © внутри ± другого ® тега</blockquote>
<ol><li>Проверка вложенных ® тегов ©</li></ol>
<a rel="nofollow" title="У нас тут свой ©" href="#test">Ссылка, в которой раньше парсер покопался бы</a>

обратите внимание на содержимое тегов <code /> и <a />.

Кстати, на данном сайте этот фикс парсера уже установлен, иначе разницы не было бы видно т.к. парсер сделал бы то, от чего мы его, собственно, и исправляем :)
5 комментариев
lifecom
Подскажите, как сделать чтобы тег code не обрабатывался внутри другого тега code?
Попробую продемонстрировать проблему:
<code>Здесь содержимое тега code, вложенного в другой тег code
lifecom
при помощи <code>содержимое</code>?
lifecom
при помощи
(&)lt;code(&)gt; содержимое(&)lt;/code(&)gt;
?
lifecom
Проблему понял: закрывающий тег вложенного code распознается как закрывающий всей конструкции.
Т.о. в идеале логика должна быть такой:
— считаем количество идущих подряд открывающих тегов code
— закрываем конструкцию не первым закрывающим тегом code, а соответствующим количеству открывающих

Вопрос только в том, как вы вставили подобную конструкцию в этот топик (раздел «Проверка»)
Serge Pustovit
по-быстрому это не исправить, это заложено в модуль текста лс.

используйте вместо скобок их сущности:

< - &lt;
> - &gt;

для вложенного code так:
&lt;code&gt;ТЕСТ&lt;/code&gt;

будет:
<code>ТЕСТ</code>
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.