Пример #1
0
 public ResourceReference(Resource source, ResourceReferenceTypes type, ReferenceSubType subType, Uri url, int count = 1)
 {
     Source  = source;
     Type    = type;
     SubType = subType;
     Url     = url;
     Count   = count;
 }
        private static void FindAndAddResource(Resource resource, HtmlDocument document, string xpath, string propertyName, ResourceReferenceTypes referenceType, ReferenceSubType defaultSubType, params string[] exclusions)
        {
            HtmlNodeCollection nodeCollection = document.DocumentNode.SelectNodes(xpath);

            if (nodeCollection != null)
            {
                foreach (HtmlNode node in nodeCollection)
                {
                    HtmlAttribute attribute = node.Attributes[propertyName];
                    if (attribute != null && !String.IsNullOrWhiteSpace(attribute.Value))
                    {
                        ReferenceSubType subType = defaultSubType;
                        if (referenceType == ResourceReferenceTypes.Image)
                        {
                            HtmlAttribute href = node.Attributes["xlink:href"];
                            if (href != null)
                            {
                                string hrefUrl = CleanUrl(href.Value);
                                if (exclusions.All(x => !hrefUrl.StartsWith(x)))
                                {
                                    AddReference(resource, hrefUrl, referenceType, node.Line, subType);
                                    subType = ReferenceSubType.Fallback;
                                }
                            }
                        }

                        string url = CleanUrl(node.Attributes[propertyName].Value);
                        if (exclusions.All(x => !url.StartsWith(x)))
                        {
                            HtmlAttribute rel = node.Attributes["rel"];
                            if (rel != null)
                            {
                                defaultSubType = EnumHelper <ReferenceSubType> .TryParse(rel.Value.Replace(" ", ""), ReferenceSubType.None, true);
                            }

                            HtmlAttribute type = node.Attributes["type"];
                            if (defaultSubType == ReferenceSubType.None && type != null)
                            {
                                switch (type.Value.ToLower())
                                {
                                case "text/javascript": defaultSubType = ReferenceSubType.JavaScript; break;

                                case "text/css": defaultSubType = ReferenceSubType.StyleSheet; break;
                                }
                            }

                            AddReference(resource, url, referenceType, node.Line, subType);
                        }
                    }
                }
            }
        }
Пример #3
0
        public ResourceReference Add(ResourceReferenceTypes type, Uri url, ReferenceSubType subType, int count = 1)
        {
            foreach (ResourceReference resourceLink in this)
            {
                if (resourceLink.Type == type && url.OriginalString == resourceLink.Url.OriginalString)
                {
                    resourceLink.Count += count;
                    return(resourceLink);
                }
            }

            ResourceReference reference = new ResourceReference(Source, type, subType, url, count);

            Add(reference);
            return(reference);
        }
        private static void AddReference(Resource resource, string url, ResourceReferenceTypes referenceType, int line, ReferenceSubType subType)
        {
            Uri uri;

            if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri))
            {
                resource.References.Add(referenceType, uri, subType);

                if (uri.IsAbsoluteUri &&
                    (referenceType == ResourceReferenceTypes.Script || referenceType == ResourceReferenceTypes.Link || referenceType == ResourceReferenceTypes.Image) &&
                    (resource.Url.Scheme == "https" && uri.Scheme == "http"))
                {
                    resource.Errors.Add(new ResourceError
                    {
                        Type    = ResourceErrorType.ResolveURL,
                        Message = "Target URL is not secure",
                        Value   = url,
                        Line    = line,
                    });
                }
            }
            else
            {
                resource.Errors.Add(new ResourceError
                {
                    Type    = ResourceErrorType.ParseURL,
                    Message = "Failed to parse URL",
                    Value   = url,
                    Line    = line,
                });
            }
        }