将标签替换为不同的值 - AEM

Sightly replace tag with different value - AEM

我正在尝试操纵从 RTE 读取的内容。 RTE 为 Shift+Enter 放置了一个 <br> 标签。为了 WAI 合规,需要将 <br> 替换为 <br aria-hidden='true'>

尝试在 JavaScript Use API 中跟随,但跟随不起作用,它保持标签原样

text.replaceAll("<br>","<br aria-hidden='true'>");

如果我用一些不同的标签替换它会正确替换值

text.replaceAll("<br>","<div>Something</div>");

在 Java 中尝试过同样的事情,也使用 API,但没有用。任何指针都会有所帮助。

如果您查看 CRXDE 中的 /libs/cq/ui/rte/core/DomProcessor.js/libs/cq/ui/rte/core/HtmlProcessor.js,您会发现这里发生了很多特定于标签的处理。

现在有多种方法可以继续 -

  1. 通过叠加两个 JS 之一找出添加自定义处理的正确位置(我不确定 JS 叠加是否有效,因为这些是静态资源)。
  2. 在您使用 Java 使用 API 的呈现逻辑中,添加一个基于字符串标记化的自定义处理步骤来处理 <br> 节点并向它们添加属性。
  3. 编写自定义重写器来处理 <br> 标记并向其添加您想要的属性。 Make 是配置驱动的,以允许将来更改。
  4. 使用 JQUERY 处理 <br> 元素并向其添加自定义属性。

我还没有探索的是可以为 RTE 定义或自定义的 HTML 规则,如果你有时间,你可以弄清楚是否可以定义一个规则来实现你想要的,这将是我认为最好的解决方案。

您需要覆盖的 rte 插件是 /etc/clientlibs/granite/coralui2/optional/rte/js/core/plugins/KeyPlugin.js 中的 KeyPlugin。

在创建 <br> 元素时的第 254 行附近,使用
添加您的属性 newBr.setAttribute('aria-hidden', true);

调试提示:您可以在此文件的 Chrome 中设置调试点,并在 运行 时更改代码(搜索 KeyPlugin) /etc/clientlibs/granite/coralui2/optional/rte.js

执行此操作后,单击对话框确定,您可以看到 <br aria-hidden="true"> 正在网络控制台中发布到服务器。

在此之后,您可能会 运行 进入 Sling 的 XSS 保护,它会从结果 HTML 中剥离该属性。查找此日志

org.apache.sling.xss.impl.HtmlToHtmlContentContext AntiSamy warning: The br tag contained an attribute that we could not process. The aria&#45;hidden attribute has been filtered out, but the tag is still in place. The value of the attribute was "true".

我知道有两种方法可以解决这个问题。

  1. 正确使用 'unsafe' 上下文。
  2. 覆盖 /libs/sling/xss/config.xml 并修改 <br> 标记的验证。