Привет. Для предстоящего сезона научно-фантастического проекта в сеттинге ближайшего будущего мы хотим попробовать изменить формат дат во всех постах в определённых категориях на нашем форуме Discourse на конкретный день/месяц/год. Звучит странно, но в нашем случае это имеет смысл: наше сообщество использует форум для ролевой игры в рамках вселенной, и вид реального года немного разрушает эффект погружения. Я пытался поискать существующие плагины или другие решения, но без особого успеха. Насколько я понимаю, мне придётся написать плагин самому и использовать плагиновые выходы (outlets) для изменения дат. У кого-нибудь есть идеи или готовые решения, которые мы могли бы использовать?
Ооо, звучит весело! Скорее всего, существующих решений для этого нет, и я не могу представить себе законную причину создавать такое, которое реально изменило бы настоящую метку времени. Вместо этого вы можете создать собственный компонент темы, который будет добавлять фиктивную метку времени к каждому сообщению.
Вы можете добавить общий [wrap] bbcode, который позволит использовать любой произвольный [wrap=] bbcode в сообщениях, которые вы хотите изменить.
Настройте что-то вроде [wrap=timechange time='Apr 1'][/wrap], и вы получите <span class="d-wrap" data-time="Apr 1" data-wrap="timechange"></span> непосредственно в сообщении. Затем вы можете использовать decorateCookedElement(), чтобы искать [data-wrap="timechange"] в каждом сообщении и решать, нужно ли изменять метку времени.
Полагаю, что в точке вывода метки времени нет плагина, но вы всегда можете просто вставить новый элемент в якорный элемент даты сообщения и использовать CSS, чтобы скрыть старый.
Вот как сейчас выглядит дата сообщения.
<div class="post-info post-date">
<a class="widget-link post-date" href="..." title="Post date">
<span title="..." data-time="..." data-format="tiny" class="relative-date">...</span>
</a>
</div>
Вам, вероятно, стоит выбрать .post-info a.post-date и добавить туда новый элемент, например span. Небольшой CSS .post-info a.post-date span:first-child { display: none; } скроет настоящую метку времени. Выбор якорного тега и сохранение его позволит вашим пользователям продолжать использовать его как обычно (там есть функция обмена).
Связав это с decorateCookedElement(), помните, что эта функция возвращает корневой элемент обработанного сообщения, поэтому вы можете быстро подняться вверх по DOM отсюда с помощью element.closest() и .querySelector(), чтобы добраться до нужного .post-info.
Использование bbcode позволит вам (и любому другому) изменять внешний вид любого сообщения, независимо от категории. Вы также можете ограничить места, где это будет отображаться, с помощью хитрого CSS. У тела должен быть класс .category-*, содержащий название категории темы. Таким образом, вы можете ограничить свой CSS только этими категориями.
Отличная информация для начала. Мы хотим, чтобы это работало автоматически, а не требовало от каждого поста отдельного включения, поэтому не уверен, что именно bbcode необходим. Но если бы существовала функция, которая автоматически генерировала это при отображении постов, это могло бы сработать. Обязательно изучу ваши предложения. Спасибо!
Для контекста: это для Neurocracy, а наш Discourse находится по адресу talk.omnipedia.app, где вы можете увидеть категорию «Спекуляции» с подкатегориями для каждой внутриигровой даты. Наше сообщество естественным образом перешло к ролевой игре, где пользователи выступают в роли участников нашей будущей вики, обсуждая различные повороты сюжета.