我们最近从 WebChatV3 切换到 V4。作为一项持续的努力,我们正在将所有自定义功能移植到新客户端。其中一项功能是检查特定域的 URL 并将 a 标签上的目标设置为“_parent”。
为了实现这一点,我们添加了对 markdown-it 的依赖项,因为 ReactWebChat 元素可以将其作为参数,如下所述:BotFramework-Webchat Middleware for renderMarkdown 我们没有添加表情符号渲染器,而是在其中构建了一个规则,并且根据上面答案中给出的示例将其传递给 ReactWebChat。该代码如下所示:
export const getConfiguredMarkdownIt = () => {
const markdownIt = new MarkdownIt.default({ html: false, xhtmlOut: true, breaks: true, linkify: true, typographer: true });
const defaultRender = markdownIt.renderer.rules.link_open || ((tokens, idx, options, env, self) => {
return self.renderToken(tokens, idx, options);
});
markdownIt.renderer.rules.link_open = (tokens, idx, options, env, self) => {
let href = '';
const hrefIndex = tokens[idx].attrIndex('href');
if (hrefIndex >= 0) {
href = tokens[idx].attrs[hrefIndex][1];
}
const newTarget = Helper.getTargetForUrl(href);
const targetIndex = tokens[idx].attrIndex('target');
if (targetIndex < 0) {
tokens[idx].attrPush(['target', newTarget]);
} else {
tokens[idx].attrs[targetIndex][1] = newTarget;
}
const relIndex = tokens[idx].attrIndex('rel');
const rel = 'noopener noreferrer';
if (relIndex < 0) {
tokens[idx].attrPush(['rel', rel]);
} else {
tokens[idx].attrs[relIndex][1] = rel;
}
console.log(tokens[idx]);
return defaultRender(tokens, idx, options, env, self);
};
return markdownIt;
}
然后将其用于传递到 ReactWebChat 元素中(为简洁起见,省略了很多):
import { getConfiguredMarkdownIt } from './MarkdownSetup'
const md = getConfiguredMarkdownIt();
...
<ReactWebChat renderMarkdown={ md.render.bind(md) } />
我们的机器人返回给用户的第一条消息发送了一个应该以“_parent”为目标的 URL。但是,它始终显示为“_blank”,而“rel”属性绝对是通过我们的自定义方法设置的。对我来说,这证实了我们的自定义规则正在起作用,但发生了一些奇怪的事情。我已经调试了会发生什么,并且呈现的 HTML,包括“目标”属性会在一段时间内保持正确的值,但最终会切换到“_blank”。后来的消息都正确呈现了它们的目标,我已将打开活动中的 URL 替换为其中一个以查看会发生什么,结果是相同的:“_blank”。
Javascript 并不是我真正的专长,我很难理解当我在 chrome 调试工具中单步执行代码时会发生什么。但我确实设法一直观察到正确的 HTML,直到 card-elements.ts。当我到达那里时,在 isBleedingAtBottom 函数的末尾,我发现的 HTML 突然在“目标”属性中有“_blank”。我完全不知道为什么会这样。
这是一个错误还是我遗漏了什么?
版本:
"botframework-webchat": "^4.7.0",
"markdown-it": "8.3.1",
这是消息的(稍作修改)JSON:
{
"type": "message",
"serviceUrl": "http://localhost:57714",
"channelId": "emulator",
"from": {
"id": "63700ba0-e2ca-11ea-8243-4773a3b07af6",
"name": "Bot",
"role": "bot"
},
"conversation": {
"id": "63727ca0-e2ca-11ea-b639-bf8d0ffe9da8|livechat"
},
"recipient": {
"id": "3952a99d-87de-4b22-a1b3-04fd8c9f141b",
"role": "user"
},
"locale": "en-US",
"inputHint": "acceptingInput",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.hero",
"content": {
"text": "Go to [this page](REMOVED URL) bla bla blah. click start to continue",
"buttons": [
{
"type": "imBack",
"title": "Start",
"value": "Start"
}
]
}
}
],
"entities": [],
"replyToId": "654f52f0-e2ca-11ea-b639-bf8d0ffe9da8",
"id": "688a0b90-e2ca-11ea-b639-bf8d0ffe9da8",
"localTimestamp": "2020-08-20T11:49:15+02:00",
"timestamp": "2020-08-20T09:49:15.336Z"
}