使用AI创建隐藏内容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(',');

    // Function to check if user is in any of the specified groups
    const userIsInAnyGroup = (userId, groupNames) => {
      // Replace this with your logic to check user group membership
      // For example, using Discourse's API or custom logic
      return groupNames.some(groupName => {
        // Check if user is in the group named `groupName`
        // Return true if the user is in the group, otherwise false
      });
    };

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

谨慎使用代码。

使用 BBCode
您可以像这样使用 BBCode:

[hide_if_not_in_group groups="staff,moderators"]
This content is hidden for users who are not staff or moderators.
[/hide_if_not_in_group]

重要注意事项
组别成员资格检查:将检查用户组别成员资格的占位符逻辑替换为您实际的实现。您可能需要使用 Discourse 的 API 或自定义逻辑来确定组别成员资格。
性能:对于大量用户或组别,可能需要优化组别成员资格检查。
安全性:确保组别名称得到适当的验证和清理,以防止安全漏洞。
灵活性:考虑允许 BBCode 使用其他属性来控制其他行为(例如,显示消息而不是隐藏内容)。
遵循这些步骤,您将拥有一个灵活的 BBCode 包装器和主题组件,可以根据组别成员资格隐藏内容。


使用 Gemini。我能够获得上述代码片段。但是,在让它们正常工作方面遇到了一些麻烦。

如果有人能指导我在自定义组件中放置的位置以及需要输入的节和代码修复。

当我将 JavaScript 放入 common 时出现的第一个错误是“import”出现错误,它期望一个 {

Error Pic

2 个赞

太棒了!

需要注意的是,正如您可能知道的,文本可以通过多种方式获取,因为它只是用 CSS 隐藏的。其中一种方式是这个帖子路由:

/posts/123/raw

2 个赞

确实。有人创建了一个使用更复杂方式移除内容的自定义组件。但它似乎坏了。

我记得它会从已处理的元素中移除内容?

1 个赞

这里有一个主题,一位用户创建了一个组件,但当我尝试时它不起作用,然后我给开发人员发了私人消息。但他可能已经离开了。

抱歉。我刚看到您无法使其正常工作。

要做的就是使用 discourse_theme 来生成一个新的空主题。然后寻找另一个具有“扩展组件”部分的主题组件……哦。我认为这行不通。您需要您的代码来定位和修改 DOM 中已有的内容。实际上,我不太确定这是否正确,因为我在这方面仍然很糟糕。

我认为如果您使用那个将组成员身份添加到 CSS 的组件,您就可以只用 CSS 来完成。

但是原始的 markdown 在我上一篇文章中展示的路由中是可用的。我不知道即使是插件也能使其安全,以至于人们无法看到隐藏的文本。类似用户备注的功能可能会解决您的问题,或者如果您确实需要针对帖子,您可以使用用户备注作为模型来创建帖子备注,这将添加一个只有工作人员才能看到的帖子自定义字段。

2 个赞

是的,不更改 API 就无法正确解决此问题,这意味着它需要一个插件,而不是主题组件。

如果您不在网站上使用“whispers”进行审核,也许可以使用现成的“whispers”?

2 个赞

此应用程序将不是以安全为中心。

这更适用于轻量级应用程序。在一个早期的话题中,有人在寻找。像这样的桌面角色扮演游戏。所以,例如,地下城主可能需要访问玩家的角色表。角色表将对玩家和游戏主持人可见。

那位家伙制作的那个伞形组件看起来不错。然而,当我尝试它时,它似乎坏了。当然,我相信即使那个也很容易被破坏。如果没记错的话,比如禁用 Java。或者一个了解网站安全模式的聪明人。安全模式可以限制为员工/管理员吗?

任何组件,因为它是客户端模组,当然不是为了安全需求。即使是 Tampermonkey 脚本也可以被成员使用,类似于主题/主题组件。

将这个想法进一步扩展,你可以在理论上根据徽章等来隐藏内容。

1 个赞

是的。禁用此功能将使其仅限员工使用安全模式。

image

2 个赞