peregoudov Опубликовано 3 Июля 2012 Жалоба Поделиться Опубликовано 3 Июля 2012 (изменено) Столкнулся вот с какой проблемой. Хотим перейти на версию 3.3.1. Форум специфический, типа научный , поэтому в старом движке были сделаны кое-какие дополнения, которые ни в коем случае нельзя потерять. В частности, у нас есть дополнительный тег для набора формул в нотации ТеХ. Поэтому сейчас пытаюсь написать соответствующий тег для версии 3.3.1. Тег не простой, содержимое должно хитрым образом обрабатываться, чисто через админ-центр этого не сделать, поэтому приходится писать php-файл. Файл я написал, но при тестировании выяснилось, что до исполнения моего кода кто-то умудряется уже попортить содержимое тега: вместо переводов строки появляются конструкции <br />, а специальные символы оказываются html-кодированными (например, $ превращается в $). Но самое неприятное --- некоторые комбинации из обратной косой и следующего за ней символа интерпретируются особым образом (например, \t превращается в табуляцию). Для формул в нотации ТеХ это поистине ужасно, поскольку с обратной косой начинаются все так называемые командные последовательности ТеХа, представляющие греческие буквы, спецсимволы, дроби и т. д. Эксперименты показали, что даже если просто в сообщении набрать \text, то \t благополучно превращается в табуляцию, а на экране при просмотре красуется лишь ext. Более того, даже если поместить \text в тег code, содержимое которого должно, по идее, отображаться "как есть", все равно остается лишь ext. Соответственно возникают вопросы. Как движок обрабатывает текст сообщения при просмотре? Почему содержимое сообщения (вне каких-либо тегов) и содержимое моего тега оказываются испорченными? Как правильно писать php-файлы для новых тегов (может, я что-то делаю не так)? Наконец, почему здесь (вроде тоже 3.3.1) все нормально отображается? Форум у меня абсолютно чистый, только выставил. Буду признателен за любую помощь и информацию. P. S. Ага, при редактировании и тут слетело! Изменено 3 Июля 2012 пользователем peregoudov Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 5 Июля 2012 Жалоба Поделиться Опубликовано 5 Июля 2012 сначала проводятся стандартные функции обработки ввода, и только потом можно добавить свои хуки, вроде так так что хардкодьте, хуки зло, обновление зло Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
peregoudov Опубликовано 7 Июля 2012 Автор Жалоба Поделиться Опубликовано 7 Июля 2012 (изменено) Ну вот код-то я смотрел, только мало что понял. В директории 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. Вопрос с обратной косой, табуляциями и т. п. снимается (если это можно так назвать): оказывается, что все эти глюки возникают только при пользовании формами быстрого редактирования и быстрого ответа. Странно, конечно, что при пользовании формой быстрого редактирования текст сообщения обрабатывается иначе, чем при пользовании полной формой, но это, как говорится, уже второй вопрос Изменено 7 Июля 2012 пользователем peregoudov Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Arhar Опубликовано 8 Июля 2012 Жалоба Поделиться Опубликовано 8 Июля 2012 Вот и непонятно, кто портит содержимое тега?ipsclass (не знаю какой именно из основных) при анализе ввода еще до вызова парсера непосредственно кодов хардкодьте файлы форума - самое алгоритмически верное решениеминус - при каждом обновлении нужно повторять это действие Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.