Перейти к содержимому


Фотография

IPB 3.3.1. Как обрабатывается текст сообщения при просмотре?

Форумы IBResource

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3
peregoudov
  • Участники
  • Cообщений: 2

Отправлено

Столкнулся вот с какой проблемой. Хотим перейти на версию 3.3.1. Форум специфический, типа научный :), поэтому в старом движке были сделаны кое-какие дополнения, которые ни в коем случае нельзя потерять. В частности, у нас есть дополнительный тег для набора формул в нотации ТеХ. Поэтому сейчас пытаюсь написать соответствующий тег для версии 3.3.1. Тег не простой, содержимое должно хитрым образом обрабатываться, чисто через админ-центр этого не сделать, поэтому приходится писать php-файл. Файл я написал, но при тестировании выяснилось, что до исполнения моего кода кто-то умудряется уже попортить содержимое тега: вместо переводов строки появляются конструкции <br />, а специальные символы оказываются html-кодированными (например, $ превращается в &#036;). Но самое неприятное --- некоторые комбинации из обратной косой и следующего за ней символа интерпретируются особым образом (например, \t превращается в табуляцию). Для формул в нотации ТеХ это поистине ужасно, поскольку с обратной косой начинаются все так называемые командные последовательности ТеХа, представляющие греческие буквы, спецсимволы, дроби и т. д.

Эксперименты показали, что даже если просто в сообщении набрать \text, то \t благополучно превращается в табуляцию, а на экране при просмотре красуется лишь ext. Более того, даже если поместить \text в тег code, содержимое которого должно, по идее, отображаться "как есть", все равно остается лишь ext.

Соответственно возникают вопросы. Как движок обрабатывает текст сообщения при просмотре? Почему содержимое сообщения (вне каких-либо тегов) и содержимое моего тега оказываются испорченными? Как правильно писать php-файлы для новых тегов (может, я что-то делаю не так)? Наконец, почему здесь (вроде тоже 3.3.1) все нормально отображается? Форум у меня абсолютно чистый, только выставил.

Буду признателен за любую помощь и информацию.

P. S. Ага, при редактировании и тут слетело!

Сообщение отредактировал peregoudov: 04 Июль 2012 - 00:19


Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

сначала проводятся стандартные функции обработки ввода, и только потом можно добавить свои хуки, вроде так

так что хардкодьте, хуки зло, обновление зло

peregoudov
  • Участники
  • Cообщений: 2

Отправлено

Ну вот код-то я смотрел, только мало что понял. В директории admin/sources/classes/bbcode/custom (куда админ-центр предлагает класть свои php-файлы с кодом для тегов) есть файлы ccs.php и defaults.php. В файле defaults.php определен некий bbcode_parent_class, имеющий три метода: preDbParse, preEditParse и preDisplayParse. Первые два нас не очень интересуют, потому как вроде бы наконец принята правильная политика ничего не парсить при помещении сообщения в базу (и, соответственно, при извлечении из базы для редактирования). А вот функция preDisplayParse как раз и должна, насколько я понимаю, делать из текста, набранного в окне ответа, кусок html-файла, который затем будет послан пользователю при просмотре темы.

Теперь смотрим, как в базовом классе определена preDisplayParse. И видим, что никак не определена: ссылается на функцию _replaceText, которая в базовом классе не определена. Она определена в дочерних классах, например, в bbcode_sharedmedia в том же defaults.php. Вот и непонятно, кто портит содержимое тега?

Кроме того, вообще не очень ясна идея парсера в контексте наследования. Это понятие объектно-ориентированного программирования (ООП) применяется все-таки к объектам, каковыми в нашем случае естественно считать теги. Но у авторов IPB bbcode_parent_class --- это "парсер". Подозрения усиливаются применением "поля типа" (currentBbcode), что для ООП --- моветон. То есть создается впечатление, что ООП и наследование в данном случае --- не лучшая форма представления кода, потому и выглядит все так запутанно.

Так что вопрос остается. Как все-таки обрабатывается текст сообщения? Какие функции вызываются и почему? Кто портит содержимое моего тега?

так что хардкодьте

Честно говоря, не понял... Нельзя ли это перевести на русский?

P. S. Вопрос с обратной косой, табуляциями и т. п. снимается (если это можно так назвать): оказывается, что все эти глюки возникают только при пользовании формами быстрого редактирования и быстрого ответа. Странно, конечно, что при пользовании формой быстрого редактирования текст сообщения обрабатывается иначе, чем при пользовании полной формой, но это, как говорится, уже второй вопрос :)

Сообщение отредактировал peregoudov: 07 Июль 2012 - 15:26


Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

Вот и непонятно, кто портит содержимое тега?

ipsclass (не знаю какой именно из основных) при анализе ввода еще до вызова парсера непосредственно кодов

хардкодьте файлы форума - самое алгоритмически верное решение
минус - при каждом обновлении нужно повторять это действие




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных