Исправление ошибки переноса, когда тире в конце предложения и перевод строки "сьедался"

FAQ
Это настолько занимательной оказалась задача, что решил перенести и вопрос и решение сюда:
Уже давно на сайте наблюдается такая проблема: если в тексте в конце строки стоит знак тире ("—"), то после сохранения текста редактор или кушают конец строки и две строки слипаются. Мелочь, а не приятно, учитывая, что основной контент — стихотворный. Сейчас приходится после тире ставить пробел, а уже затем перевод строки. Кто-то может подсказать, как это вылечить?

Проблема

Ошибка связана с тем, что Jevix скушает перевод строки если в конце предложения стоит тире:

Ряд 1 -
Второй

будет

Ряд 1 — Второй

И ещё целая куча проблем связанная с этим. Например, невозможность оставить дефис просто так:

текст 1
---
[перевод строки который парсеру тоже не по нраву]
текст 2

будет:

текст 1 - текст 2

И таких «приключений» много. Часто такое грустное поведение можно встретить если на сайте публикуются стихотворения.

Решение

После двух часов ковыряния «чудесного» кода парсера и, тяжело вздыхая со словами «вот это хардкор», решение найдено. Чтобы исправить такое положение дел нужно внести правки в jevix.class.php — метод
protected function dash(&$dash)

нужно заменить на:

/**
 * Проверка на дефис
 * fix by Serge Pustovit (PSNet) <light.feel@gmail.com> http://psnet.lookformp3.net
 *
 * @param $dash			возвращаемое представление дефиса
 * @return bool
 */
protected function dash(&$dash){
  if ($this->curCh != '-') {
    return false;
  }
  $dash = '';
  $this->saveState();
  $this->getCh();
  // Несколько подряд
  while ($this->curCh == '-') {
    $this->getCh();
  }
  /*
   * количество переводов строк
   */
  $iNL = 0;
  if (!$this->skipNL($iNL) && !$this->skipSpaces()) {
    $this->restoreState();
    return false;
  }
  $dash = $this->dash;
  if ($iNL) {
    /*
     * вернуть нужное количествово переводов строк
     */
    $dash .= str_repeat($this->br, $iNL);
  }
  return true;
}


Тест

После такой модификации проверочный текст:

Ряд 1 -
Второй
Ещё какая-то строка
Спелая груша - съедобная, парарам да-да-да
---

Строка -

Через строку

будет не таким (как его видит парсер сейчас):

Ряд 1 — Второй
Ещё какая-то строка
Спелая груша — съедобная, парарам да-да-да
— Строка — Через строку 

а как ему и положено быть:

Ряд 1 —
Второй
Ещё какая-то строка
Спелая груша — съедобная, парарам да-да-да
—

Строка —

Через строку 

т.е. где нужно оставлены дефисы, где-то заменены на тире, также оставлены переводы строк, где их задумал автор.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.