Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
psnet opened this issue Jan 21, 2015 · 0 comments

Comments

@psnet
Copy link

psnet commented Jan 21, 2015

Проблема

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

// Автозамена
'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) <[email protected]> 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>

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

Текст &copy; здесь<br>
<pre class="prettyprint"><code>Больше текста внутри (C) кода (R) знаки +/-</code></pre><br>
Некоторый &reg; текст после<br>
<br>
<blockquote>Тест тегов &copy; внутри ± другого &reg; тега</blockquote><br>
<ol><li>Проверка вложенных &reg; тегов &copy;</li></ol><br>
<a rel="nofollow" title="У нас тут свой (С)" href="#test">Ссылка, в которой раньше парсер покопался бы</a>

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

Текст &copy; здесь<br>
<pre class="prettyprint"><code>Больше текста внутри &copy; кода &reg; знаки ±</code></pre><br>
Некоторый &reg; текст после<br>
<br>
<blockquote>Тест тегов &copy; внутри ± другого &reg; тега</blockquote><br>
<ol><li>Проверка вложенных &reg; тегов &copy;</li></ol><br>
<a rel="nofollow" title="У нас тут свой &copy;" href="#test">Ссылка, в которой раньше парсер покопался бы</a>

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant