Exemple #1
0
 /// <summary>
 /// 调用此方法通知预热 JumonyParser
 /// </summary>
 public static void WarmUp()
 {
     if (!_isWarmedUp)
     {
         JumonyReader.WarmUp();
         HtmlSpecification.WarmUp();
         _isWarmedUp = true;
     }
 }
Exemple #2
0
        private void ProcessBeginTag(Match match)
        {
            string tagName    = match.Groups["tagName"].Value;
            bool   selfClosed = match.Groups["selfClosed"].Success;

            if (HtmlSpecification.selfCloseTags.Contains(tagName, StringComparer.OrdinalIgnoreCase))
            {
                selfClosed = true;
            }


            //检查父标签是否可选结束标记,并相应处理
            {
                var element = containerStack.Peek() as DomElement;
                if (element != null && HtmlSpecification.optionalCloseTags.Contains(element.Name, StringComparer.OrdinalIgnoreCase))
                {
                    if (HtmlSpecification.ImmediatelyClose(element.Name, tagName))
                    {
                        containerStack.Pop();
                    }
                }
            }



            //处理所有属性
            var attributes = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            foreach (Capture capture in match.Groups["attribute"].Captures)
            {
                string name  = capture.FindCaptures(match.Groups["attrName"]).Single().Value;
                string value = capture.FindCaptures(match.Groups["attrValue"]).Select(c => c.Value).SingleOrDefault();

                value = HtmlEncoding.HtmlDecode(value);

                if (attributes.ContainsKey(name))
                {
                    continue;
                }

                attributes.Add(name, value);
            }


            //加入容器堆栈。
            {
                var element = CreateElement(tagName, attributes);


                if (!selfClosed)
                {
                    containerStack.Push(element);
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// 查找指定元素的结束标签(用于CData元素结束位置查找)
        /// </summary>
        /// <param name="index">查找的开始位置</param>
        /// <param name="elementName">元素名称</param>
        /// <returns>找到的结束标签,若已到达文档末尾,则返回 null</returns>
        protected virtual HtmlEndTag FindEndTag(int index, string elementName)
        {
            Regex endTagRegex = HtmlSpecification.GetEndTagRegex(elementName);
            var   endTagMatch = endTagRegex.Match(HtmlText, index);


            if (!endTagMatch.Success)
            {
                return(null);
            }


            return(new HtmlEndTag(CreateFragment(endTagMatch), elementName));
        }
 /// <summary>
 /// 检查当前开放的可选结束标签是否必须立即关闭
 /// </summary>
 /// <param name="tagName">分析器遇到的标签</param>
 /// <param name="element">当前开放的可选结束标签</param>
 /// <returns></returns>
 protected virtual bool ImmediatelyClose(string tagName, IHtmlElement element)
 {
     return(HtmlSpecification.ImmediatelyClose(element.Name, tagName));
 }
Exemple #5
0
 /// <summary>
 /// 转换容器中所有 URI 与当前请求匹配。
 /// </summary>
 /// <param name="container">确定要转换 URI 范围的容器</param>
 protected virtual void ResolveUri(IHtmlContainer container)
 {
     foreach (var attribute in container.Descendants().SelectMany(e => e.Attributes()).Where(a => HtmlSpecification.IsUriValue(a)).ToArray())
     {
         ResolveUri(attribute);
     }
 }