CssImportRule
Represents a CSS import rule.
using AngleSharp.Dom.Collections;
using AngleSharp.Extensions;
using AngleSharp.Network;
using AngleSharp.Parser.Css;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace AngleSharp.Dom.Css
{
internal sealed class CssImportRule : CssRule, ICssImportRule, ICssRule, ICssNode, IStyleFormattable
{
private string _href;
private CssStyleSheet _styleSheet;
public string Href {
get {
return _href;
}
set {
_href = value;
}
}
public MediaList Media => base.Children.OfType<MediaList>().FirstOrDefault();
IMediaList ICssImportRule.Media {
get {
return Media;
}
}
public ICssStyleSheet Sheet => _styleSheet;
internal CssImportRule(CssParser parser)
: base(CssRuleType.Import, parser)
{
AppendChild(new MediaList(parser));
}
internal async Task LoadStylesheetFromAsync(Document document)
{
if (document != null) {
IResourceLoader loader = document.Loader;
Url url = new Url(Url.Create(Owner.Href ?? document.BaseUri), _href);
if (!IsRecursion(url) && loader != null) {
ResourceRequest request = Owner.OwnerNode.CreateRequestFor(url);
using (IResponse response = await loader.DownloadAsync(request).Task.ConfigureAwait(false)) {
CssStyleSheet sheet = new CssStyleSheet(this, response.Address.Href);
TextSource source = new TextSource(response.Content, null);
CssStyleSheet styleSheet = _styleSheet;
_styleSheet = await Parser.ParseStylesheetAsync(sheet, source).ConfigureAwait(false);
}
}
}
}
protected override void ReplaceWith(ICssRule rule)
{
CssImportRule cssImportRule = rule as CssImportRule;
_href = cssImportRule._href;
_styleSheet = null;
base.ReplaceWith(rule);
}
public override void ToCss(TextWriter writer, IStyleFormatter formatter)
{
string mediaText = Media.MediaText;
string str = string.IsNullOrEmpty(mediaText) ? string.Empty : " ";
string value = _href.CssUrl() + str + mediaText;
writer.Write(formatter.Rule("@import", value));
}
private bool IsRecursion(Url url)
{
string href = url.Href;
ICssStyleSheet cssStyleSheet = base.Owner;
while (cssStyleSheet != null && !cssStyleSheet.Href.Is(href)) {
cssStyleSheet = cssStyleSheet.Parent;
}
return cssStyleSheet != null;
}
}
}