Использование ИИ для создания обертки bbcode для скрытия контента

Создайте обертку для BBCode общего назначения и компонент темы, который скрывает содержимое, если пользователь не входит в указанную группу (переменная строки).

Показать черновики

Создание обертки для BBCode общего назначения и компонента темы
Понимание требований
Исходя из вашего запроса, мы создадим:

  • Обертку для BBCode общего назначения, которая может принимать пользовательские атрибуты.
  • Компонент темы, который скрывает содержимое на основе строковой переменной группы, передаваемой в обертку BBCode.

Реализация обертки для BBCode
Мы создадим обертку для BBCode, которая может принимать произвольные атрибуты. Эти атрибуты будут передаваться в компонент темы для оценки.

Ruby

# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
  attributes = tag.attributes || {}
  "<div class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'>#{content}</div>"
end

Используйте код с осторожностью.

Создание компонента темы
Компонент темы проверит, принадлежит ли текущий пользователь какой-либо из групп, указанных в атрибуте data-group-names. Если нет, содержимое будет скрыто.

JavaScript

// app/assets/javascripts/discourse/components/hide-if-not-in-group.js
import Component from 'discourse/components/component';

export default Component.extend({
  tagName: 'div',
  classNames: ['hide-if-not-in-group'],

  didInsertElement() {
    const currentUserId = Discourse.currentUser.id;
    const groupNames = this.element.dataset.groupNames.split(',');

    // Функция для проверки, входит ли пользователь в какую-либо из указанных групп
    const userIsInAnyGroup = (userId, groupNames) => {
      // Замените это на вашу логику проверки членства пользователя в группе
      // Например, используя API Discourse или пользовательскую логику
      return groupNames.some(groupName => {
        // Проверьте, входит ли пользователь в группу с именем `groupName`
        // Верните true, если пользователь входит в группу, иначе false
      });
    };

    if (!userIsInAnyGroup(currentUserId, groupNames)) {
      this.element.style.display = 'none';
    }
  }
});

Используйте код с осторожностью.

Использование BBCode
Вы можете использовать BBCode следующим образом:

[hide_if_not_in_group groups="staff,moderators"]
Это содержимое скрыто для пользователей, которые не являются сотрудниками или модераторами.
[/hide_if_not_in_group]

Важные соображения
Проверка членства в группе: Замените логику-заполнитель для проверки членства пользователя в группе на вашу фактическую реализацию. Возможно, вам потребуется использовать API Discourse или пользовательскую логику для определения членства в группе.
Производительность: Для большого количества пользователей или групп может потребоваться оптимизация проверки членства в группе.
Безопасность: Обеспечьте правильную валидацию и санитизацию имен групп для предотвращения уязвимостей безопасности.
Гибкость: Рассмотрите возможность добавления дополнительных атрибутов для BBCode для управления другим поведением (например, отображение сообщения вместо скрытия содержимого).
Следуя этим шагам, вы получите гибкую обертку для BBCode и компонент темы, которые могут скрывать содержимое на основе членства в группе.


Используя Gemini, мне удалось получить вышеуказанные фрагменты кода. Однако у меня возникли трудности с их запуском.

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

Первая ошибка, которая появилась при размещении JavaScript в разделе common, была связана с ошибкой на строке “import”, где ожидался символ {

Скриншот ошибки

Это очень круто!

Оговорка, о которой вы, вероятно, знаете, заключается в том, что текст доступен несколькими способами, поскольку он просто скрыт с помощью CSS. Один из них — этот маршрут поста:

/posts/123/raw

Действительно. Кто-то создал пользовательский компонент, использующий более сложный способ удаления контента. Но, похоже, он сломан.

Если не ошибаюсь, он удаляет контент из элемента cooked?

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

Извините. Я только что прочитал, что у вас не получается заставить это работать.

Что нужно сделать: используйте discourse_theme, чтобы создать новую пустую тему. Затем найдите другой компонент темы, в котором есть раздел «extends component»… О, я не думаю, что это сработает. Вам нужно, чтобы ваш код находил и изменял то, что уже находится в DOM. На самом деле, я не до конца уверен, что это правильно, так как я всё ещё довольно плохо разбираюсь в таких вещах.

Думаю, вы можете обойтись только CSS, если используете тот компонент, который добавляет информацию о групповой принадлежности в CSS.

Однако исходный Markdown доступен в маршруте, который я указал в своём последнем сообщении. Я не вижу, как даже плагин может сделать так, чтобы было невозможно увидеть скрытый текст. Возможно, проблему решат заметки о пользователях, или, если вам действительно нужно работать с постами, вы можете использовать заметки о пользователях как модель для создания заметок о постах, которые добавят пользовательское поле для поста, видимое только сотрудникам.

Да, вы не сможете решить эту задачу должным образом без изменения API, а это значит, что потребуется плагин, а не компонент темы.

Если вы не используете функцию «шёпоты» на своём сайте для модерации, возможно, стоит воспользоваться тем, что уже есть из коробки?

Применение этого решения не будет ориентировано на безопасность.

Это больше подходит для легких приложений. В одной из предыдущих тем кто-то искал что-то подобное для настольных ролевых игр. Например, мастеру подземелий может потребоваться доступ к листу персонажа игрока. Лист персонажа будет виден игроку и мастерам игры.

Компонент-обертка, который создал один участник, выглядит неплохо. Однако, похоже, он не работает, когда я попробовал его запустить. Но, конечно, я считаю, что даже его можно относительно легко скомпрометировать. Если я не ошибаюсь, достаточно отключить Java. Или даже кто-то, кто разбирается в безопасном режиме сайта. Можно ли ограничить безопасный режим только для сотрудников/администраторов?

Любой компонент, поскольку клиентские модификации, конечно, не предназначены для задач безопасности. Даже скрипт Tampermonkey может использоваться участниками так же, как и компоненты тем.

Развивая эту идею дальше, теоретически можно скрывать контент на основе значков и т. д.

Да. Отключение этой опции позволит использовать безопасный режим только сотрудникам.

image