Перейти к контенту

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


Рекомендуемые сообщения

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

 

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

 

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

 

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

 

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

Изменено пользователем peregoudov
Ссылка на комментарий
Поделиться на других сайтах

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

 

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

Ссылка на комментарий
Поделиться на других сайтах

Ну вот код-то я смотрел, только мало что понял. В директории 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
Ссылка на комментарий
Поделиться на других сайтах

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

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

 

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

минус - при каждом обновлении нужно повторять это действие

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.