[英]How to build a custom AngleSharp element and insert/transform HTML sections into the element
[英]Inserting Custom Element with AngleSharp
我正在嘗試更新一個使用基於 AngleSharp 的消毒劑來處理用戶生成的 HTML 內容的站點。 站點用戶需要能夠嵌入 iframe,我正在嘗試使用白名單來控制框架可以加載的域。 我想將“被阻止”的 iframe 重寫為一個新的自定義元素“blocked-iframe”,然后該元素將被 sanitizer 刪除,因此我們可以查看是否需要將其他域添加到白名單中。
我正在嘗試使用基於此答案的解決方案: https://stackoverflow.com/a/55276825/794
它看起來像這樣:
string BlockIFrames(string content)
{
var parser = new HtmlParser(new HtmlParserOptions { });
var doc = parser.Parse(content);
foreach (var element in doc.QuerySelectorAll("iframe"))
{
var src = element.GetAttribute("src");
if (string.IsNullOrEmpty(src) || !Settings.Sanitization.IFrameWhitelist.Any(wls => src.StartsWith(wls)))
{
var newElement = doc.CreateElement("blocked-iframe");
foreach (var attr in element.Attributes)
{
newElement.SetAttribute(attr.Name, attr.Value);
}
element.Insert(AdjacentPosition.BeforeBegin, newElement.OuterHtml);
element.Remove();
}
}
return doc.FirstElementChild.OuterHtml;
}
它表面上可行,但我注意到新元素標簽中的尖括號在插入時被轉義,因此結果只是作為文本寫入頁面。 我想我可以構建一個 map 替換,然后在發回之前對字符串執行它們,但我想知道是否有一種方法可以使用 AngleSharp 的 API。 該網站目前使用的是 0.9.9,考慮到其他一些正在使用的依賴項,我不確定我們能夠更新多遠。
在源代碼中挖掘我在INode
中找到了ReplaceChild
方法,如果從element
的父級調用該方法則有效
string BlockIFrames(string content)
{
var parser = new HtmlParser(new HtmlParserOptions { });
var doc = parser.Parse(content);
foreach (var element in doc.QuerySelectorAll("iframe"))
{
var src = element.GetAttribute("src");
if (string.IsNullOrEmpty(src) ||
!Settings.Sanitization.IFrameWhitelist.Any(wls => src.StartsWith(wls)))
{
var newElement = doc.CreateElement("blocked-iframe");
foreach (var attr in element.Attributes)
{
newElement.SetAttribute(attr.Name, attr.Value);
}
element.Parent.ReplaceChild(newElement, element);
}
}
return doc.FirstElementChild.OuterHtml;
}
我會繼續測試,但這對我來說似乎足夠體面,如果有更好的方法我很想聽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.