Исправление и оптимизация метода Cut модуля Text

Разработка под LiveStreet CMS
Метод
public function Cut($sText)
из модуля Text далеко не идеальный и видно что раньше он брал на себя часть забот парсера, например, превращал все переводы строк в унифицированную форму, хотя на сегодняшний день вместо него это успешно делает .

Исправление и оптимизация метода Cut модуля Text →

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

FAQ
Проблема

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

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

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

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

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

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

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