|
using AngleSharp;
using AngleSharp.DOM.Css;
using AngleSharp.DOM.Html;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Samples.ViewModels
{
public class SheetViewModel : RequestViewModel
{
ObservableCollection<StyleSheet> source;
StyleSheet selected;
Uri local;
ObservableCollection<CssRuleViewModel> tree;
CancellationTokenSource cts;
Task populate;
public SheetViewModel()
{
Status = "Nothing to display ...";
source = new ObservableCollection<StyleSheet>();
tree = new ObservableCollection<CssRuleViewModel>();
}
public ObservableCollection<StyleSheet> Source
{
get { return source; }
}
public ObservableCollection<CssRuleViewModel> Tree
{
get { return tree; }
}
public StyleSheet Selected
{
get { return selected; }
set
{
selected = value;
RaisePropertyChanged();
if (populate != null && !populate.IsCompleted)
cts.Cancel();
populate = PopulateTree();
}
}
async Task PopulateTree()
{
tree.Clear();
cts = new CancellationTokenSource();
var content = String.Empty;
var token = cts.Token;
if (String.IsNullOrEmpty(selected.Href))
content = selected.OwnerNode.TextContent;
else
{
var http = new HttpClient { BaseAddress = local };
var request = await http.GetAsync(selected.Href, cts.Token);
content = await request.Content.ReadAsStringAsync();
token.ThrowIfCancellationRequested();
}
var css = DocumentBuilder.Css(content);
for (int i = 0, j = 0; i < css.CssRules.Length; i++, j++)
{
tree.Add(new CssRuleViewModel(css.CssRules[i]));
if (j == 80)
{
j = 0;
await Task.Delay(1, cts.Token);
}
}
}
protected override async Task Use(Uri url, HTMLDocument document, CancellationToken cancel)
{
local = url;
Selected = null;
source.Clear();
Status = "Looking for stylesheets ...";
for (int i = 0; i < document.StyleSheets.Length; i++)
{
var s = document.StyleSheets[i];
source.Add(s);
}
await Task.Yield();
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Florian lives in Munich, Germany. He started his programming career with Perl. After programming C/C++ for some years he discovered his favorite programming language C#. He did work at Siemens as a programmer until he decided to study Physics.
During his studies he worked as an IT consultant for various companies. After graduating with a PhD in theoretical particle Physics he is working as a senior technical consultant in the field of home automation and IoT.
Florian has been giving lectures in C#, HTML5 with CSS3 and JavaScript, software design, and other topics. He is regularly giving talks at user groups, conferences, and companies. He is actively contributing to open-source projects. Florian is the maintainer of AngleSharp, a completely managed browser engine.