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

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 (не знаю какой именно из основных) при анализе ввода еще до вызова парсера непосредственно кодов

 

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

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

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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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