CssImportRule
Represents a CSS import rule.
using AngleSharp.Dom.Collections;
using AngleSharp.Extensions;
using AngleSharp.Network;
using AngleSharp.Parser.Css;
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 LoadStylesheetFrom(Document document)
{
if (document != null) {
IResourceLoader loader = document.Loader;
Url baseUrl = Url.Create(base.Owner.Href ?? document.BaseUri);
Url url = new Url(baseUrl, _href);
if (!IsRecursion(url) && loader != null) {
IElement element = base.Owner.OwnerNode;
ResourceRequest request = element.CreateRequestFor(url);
IDownload download = loader.DownloadAsync(request);
using (IResponse response = await download.Task.ConfigureAwait(false)) {
CssStyleSheet sheet = new CssStyleSheet(this, response.Address.Href);
TextSource source = new TextSource(response.Content, null);
_styleSheet = await base.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 string ToCss(IStyleFormatter formatter)
{
string mediaText = Media.MediaText;
string str = string.IsNullOrEmpty(mediaText) ? string.Empty : " ";
string value = _href.CssUrl() + str + mediaText;
return 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;
}
}
}