/// <summary> Constructs a scanner based on the given policy.</summary> /// <param name="policy">The policy to follow when scanning.</param> public CssScanner(Policy policy) { this.policy = policy; // FIX: Leave this in case there is no solution, hex is better that lots of rgb/a autoconversions. // Set UseHex to true to preserve Hex color format on CSS and avoid rgba() conversion //var colorType = typeof(CssKeywords).Assembly.GetType("AngleSharp.Css.Values.Color"); //var useHex = colorType.GetProperty("UseHex", BindingFlags.Public | BindingFlags.Static); //useHex.SetValue(null, true); var cssParserOptions = new CssParserOptions { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true, IsToleratingInvalidSelectors = true }; IBrowsingContext browsingContext = BrowsingContext.New(Configuration.Default .WithCss() .With(new DefaultHttpRequester(userAgent: null, setup: SetupHttpRequest)) .WithDefaultLoader(new LoaderOptions { IsResourceLoadingEnabled = true })); parser = new CssParser(cssParserOptions, browsingContext); }
internal static IHtmlDocument ParseDocument(String source, CssParserOptions options) { var context = BrowsingContext.New(Configuration.Default.WithCss(options)); var parser = context.GetService <IHtmlParser>(); return(parser.ParseDocument(source)); }
private CssParserOptions CreateCssParserOptions() { var options = new CssParserOptions(); options.IsIncludingUnknownDeclarations = true; options.IsIncludingUnknownRules = true; options.IsStoringTrivia = true; options.IsToleratingInvalidConstraints = true; options.IsToleratingInvalidSelectors = true; options.IsToleratingInvalidValues = true; return(options); }
public void CssParseMediaAndMsViewPortWithUnknownRules() { var options = new CssParserOptions() { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true }; var css = "@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .dsip { display: block; }"; var doc = ParseStyleSheet(css, options); var result = doc.ToCss(); Assert.AreEqual("@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } }" + Environment.NewLine + ".dsip { display: block }", result); }
public void StyleSheetWithInitialCommentShouldWorkWithTriviaActive() { var options = new CssParserOptions { IsStoringTrivia = true }; var parser = new CssParser(options); var document = parser.ParseStylesheet(@"/* Comment at the start */ body { font-size: 10pt; }"); var comment = document.Children.First(); Assert.IsInstanceOf <ICssComment>(comment); Assert.AreEqual(" Comment at the start ", ((ICssComment)comment).Data); }
public void CssParseMsViewPortWithUnknownRules() { var options = new CssParserOptions() { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true }; var css = "@-ms-viewport{width:device-width} .dsip { display: block; }"; var doc = ParseStyleSheet(css, options); var result = doc.ToCss(); Assert.AreEqual("@-ms-viewport{width:device-width}\r\n.dsip { display: block }", result); }
public void CssParseMediaAndMsViewPortWithUnknownRules() { var options = new CssParserOptions() { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true, IsToleratingInvalidConstraints = true, IsToleratingInvalidValues = true }; var css = "@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .dsip { display: block; }"; var doc = ParseStyleSheet(css, options); var result = doc.CssText; Assert.AreEqual("@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } }\r\n.dsip { display: block; }", result); }
public void ParseInlineStyleWithToleratedInvalidValueShouldReturnThatValue() { var html = "<div style=\"background-image: url(javascript:alert(1))\"></div>"; var options = new CssParserOptions { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true, IsToleratingInvalidConstraints = true, IsToleratingInvalidValues = true }; var config = Configuration.Default.WithCss(e => e.Options = options); var parser = new HtmlParser(config); var dom = parser.Parse(html); var div = dom.QuerySelector <IHtmlElement>("div"); Assert.AreEqual(1, div.Style.Length); Assert.AreEqual("background-image", div.Style[0]); Assert.AreEqual("url(\"javascript:alert(1)\")", div.Style.BackgroundImage); }
public void ParseInlineStyleWithUnknownDeclarationShouldBeAbleToRemoveThatDeclaration() { var html = @"<DIV STYLE='background: url(""javascript:alert(foo)"")'>"; var options = new CssParserOptions { IsIncludingUnknownDeclarations = true, IsIncludingUnknownRules = true, IsToleratingInvalidConstraints = true, IsToleratingInvalidValues = true }; var config = Configuration.Default.WithCss(e => e.Options = options); var parser = new HtmlParser(config); var dom = parser.Parse(html); var div = dom.QuerySelector <IHtmlElement>("div"); Assert.AreEqual(1, div.Style.Length); Assert.AreEqual("background", div.Style[0]); div.Style.RemoveProperty("background"); Assert.AreEqual(0, div.Style.Length); }
/// <summary> /// Registers the default styling service with a new CSS style engine /// to retrieve, if no other styling service has been registered yet. /// </summary> /// <param name="configuration">The configuration to extend.</param> /// <param name="options">Optional options for the parser.</param> /// <returns>The new instance with the service.</returns> public static IConfiguration WithCss(this IConfiguration configuration, CssParserOptions options = default) { configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); var service = new CssStylingService(); if (!configuration.Has <ICssDefaultStyleSheetProvider>()) { configuration = configuration.With(new CssDefaultStyleSheetProvider()); } if (!configuration.Has <IFeatureValidatorFactory>()) { configuration = configuration.With(Factory.FeatureValidator); } if (!configuration.Has <IDocumentFunctionFactory>()) { configuration = configuration.With(Factory.DocumentFunction); } if (!configuration.Has <IPseudoElementFactory>()) { configuration = configuration.With(Factory.PseudoElement); } if (!configuration.Has <IDeclarationFactory>()) { configuration = configuration.With(Factory.Declaration); } if (!configuration.Has <ICssParser>()) { configuration = configuration.With <ICssParser>(context => new CssParser(options, context)); } return(configuration .WithOnly(Factory.Observer) .WithOnly <IStylingService>(service)); }
/// <summary> /// Registers the default styling service with a new CSS style engine /// to retrieve, if no other styling service has been registered yet. /// </summary> /// <param name="configuration">The configuration to extend.</param> /// <param name="options">Optional options for the parser.</param> /// <param name="setup">Optional setup for the style engine.</param> /// <returns>The new instance with the service.</returns> public static IConfiguration WithCss(this IConfiguration configuration, CssParserOptions options = default(CssParserOptions), Action <CssStylingService> setup = null) { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } var service = new CssStylingService(); setup?.Invoke(service); if (!configuration.Has <IFeatureValidatorFactory>()) { configuration = configuration.With(Factory.FeatureValidator); } if (!configuration.Has <IDocumentFunctionFactory>()) { configuration = configuration.With(Factory.DocumentFunction); } if (!configuration.Has <IPseudoElementFactory>()) { configuration = configuration.With(Factory.PseudoElement); } if (!configuration.Has <IDeclarationFactory>()) { configuration = configuration.With(Factory.Declaration); } if (!configuration.Has <ICssParser>()) { configuration = configuration.With <ICssParser>(context => new CssParser(options, context)); } return(configuration.WithOnly(Factory.Observer).With(service)); }
/// <summary> /// Creates a new style engine. /// </summary> public CssStyleEngine() { _options = new CssParserOptions(); }
internal static CssProperty ParseDeclaration(String source, CssParserOptions options) { var parser = new CssParser(options); return(parser.ParseDeclaration(source)); }
internal static ICssStyleSheet ParseStyleSheet(String source, CssParserOptions options) { var parser = new CssParser(options); return(parser.ParseStylesheet(source)); }
internal static CssStyleSheet ParseStyleSheet(String source, CssParserOptions options = default) { var parser = new CssParser(options); return(parser.ParseStyleSheet(source) as CssStyleSheet); }