将标签替换为不同的值 - 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
,您会发现这里发生了很多特定于标签的处理。
现在有多种方法可以继续 -
- 通过叠加两个 JS 之一找出添加自定义处理的正确位置(我不确定 JS 叠加是否有效,因为这些是静态资源)。
- 在您使用 Java 使用 API 的呈现逻辑中,添加一个基于字符串标记化的自定义处理步骤来处理
<br>
节点并向它们添加属性。
- 编写自定义重写器来处理
<br>
标记并向其添加您想要的属性。 Make 是配置驱动的,以允许将来更改。
- 使用 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-hidden attribute has been filtered out, but the tag is still in place. The value of the attribute was "true".
我知道有两种方法可以解决这个问题。
- 正确使用 'unsafe' 上下文。
- 覆盖
/libs/sling/xss/config.xml
并修改 <br>
标记的验证。
我正在尝试操纵从 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
,您会发现这里发生了很多特定于标签的处理。
现在有多种方法可以继续 -
- 通过叠加两个 JS 之一找出添加自定义处理的正确位置(我不确定 JS 叠加是否有效,因为这些是静态资源)。
- 在您使用 Java 使用 API 的呈现逻辑中,添加一个基于字符串标记化的自定义处理步骤来处理
<br>
节点并向它们添加属性。 - 编写自定义重写器来处理
<br>
标记并向其添加您想要的属性。 Make 是配置驱动的,以允许将来更改。 - 使用 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-hidden attribute has been filtered out, but the tag is still in place. The value of the attribute was "true".
我知道有两种方法可以解决这个问题。
- 正确使用 'unsafe' 上下文。
- 覆盖
/libs/sling/xss/config.xml
并修改<br>
标记的验证。