/// <summary> /// 调用此方法通知预热 JumonyParser /// </summary> public static void WarmUp() { if (!_isWarmedUp) { JumonyReader.WarmUp(); HtmlSpecification.WarmUp(); _isWarmedUp = true; } }
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); } } }
/// <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)); }
/// <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); } }