sidebarMod: 增删侧边栏链接和部分

sidebarMod

这是我用于修改侧边栏的脚本(在自定义侧边栏部分主题中首次提及)。

它使用 promises 和 MutationObserver 来监视侧边栏的变化(例如展开或折叠),并以高效的方式添加/删除内容。

我认为它足够灵活,可以满足大多数用例。您可以添加链接(通过追加、前置或在现有链接之前/之后插入来定位)、删除部分、删除链接,甚至删除 ⋮More

甚至可以更改查看者是访客还是注册用户时的行为。例如,我正在使用它来删除与访客无关的自定义部分。

它是新的自定义侧边栏功能(通过 SiteSetting.enable_custom_sidebar_sections 启用)的一个很好的补充,因此我没有费心添加创建部分的*功能。

如果您发现错误或需要额外功能,请告诉我。

安装

创建一个新的主题组件,并将其粘贴到 Head 中。请记住为您的主题启用它。

配置

您只需要编辑顶部的 injectionsremovals

我建议一开始就将其保持原样,以便您了解它的作用。我试图使示例配置具有说明性。

我个人是这样使用的:

  /**
   * 链接定位器:
   *   (bool) prepend, append:将链接前置/后置到部分
   *   (str)  addBeforeKebab, addAfterKebab:在现有链接之前/之后添加链接
   * 链接可见性:
   *   (str)  injectFor:仅为“anon”用户、“registered”用户或“both”注入链接(默认:“both”)
   */
  injections: [
    { sectionSelector: '.sidebar-section[data-section-name="community"]',
      links: [
        { text: 'Guidelines', kebab: 'guidelines', title: 'Guidelines for using this site', href: '/guidelines', icon: 'gavel', addBeforeKebab: 'faq', injectFor: 'registered' }
      ]
    },
    { sectionSelector: '.sidebar-section[data-section-name="categories"]',
      links: [
        { text: 'Site Map', kebab: 'site-map', title: 'Site Map', href: '/t/32', icon: 'map-marker-alt', prepend: true }
      ]
    }
  ],

  /**
   * 部分选项:
   *   (str) removeFor:仅为“anon”用户、“registered”用户或“both”删除部分(默认:“none”)
   *   (str) removeMore:仅为“anon”用户、“registered”用户或“both”删除“⋮More”(默认:“none”)
   *                       如果您知道由于链接删除而导致其为空,则很有用
   * 链接删除选项:
   *   (str) removeFor:仅为“anon”用户、“registered”用户或“both”删除链接(默认:“both”)
   */
  removals: [
    { sectionSelector: '.sidebar-section[data-section-name="community"]',
      links: [{ kebab: 'badges', removeFor: 'anon' }]
    },
    { sectionSelector: '.sidebar-custom-sections .sidebar-section[data-section-name="my-topics"]',
      removeFor: 'anon'
    }
  ],

我的问题

我研究了使用API来做这件事,但我认为实现的功能还不够。

如果我想“正确地”做这件事,而不是将东西塞进 DOM,我该怎么做?我需要用 Ruby 创建一个插件吗?任何提示都将不胜感激。

2 个赞

已更新以支持 data-link-name

谢谢,这对我实现一个需要在页面转换时更新的自定义侧边栏部分非常有帮助(请参阅 https://meta.discourse.org/t/making-custom-changes-to-the-sidebar-programmatically/273027)。我遇到的一个问题是,当单击自定义链接时,会触发完整的页面刷新。您是如何解决这个问题的?

FYI,在此处找到解决方案:Reload page body when clicking a link in a custom header