コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: CssCases.cs プロジェクト: zzc000/AngleSharp
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
ファイル: Error.cs プロジェクト: zidanfei/AngleSharp
        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);
        }
コード例 #9
0
ファイル: Error.cs プロジェクト: zidanfei/AngleSharp
        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);
        }
コード例 #10
0
        /// <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));
        }
コード例 #11
0
        /// <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));
        }
コード例 #12
0
 /// <summary>
 /// Creates a new style engine.
 /// </summary>
 public CssStyleEngine()
 {
     _options = new CssParserOptions();
 }
コード例 #13
0
        internal static CssProperty ParseDeclaration(String source, CssParserOptions options)
        {
            var parser = new CssParser(options);

            return(parser.ParseDeclaration(source));
        }
コード例 #14
0
        internal static ICssStyleSheet ParseStyleSheet(String source, CssParserOptions options)
        {
            var parser = new CssParser(options);

            return(parser.ParseStylesheet(source));
        }
コード例 #15
0
        internal static CssStyleSheet ParseStyleSheet(String source, CssParserOptions options = default)
        {
            var parser = new CssParser(options);

            return(parser.ParseStyleSheet(source) as CssStyleSheet);
        }