//DI przez metode public void AddElementToMyHtml(IHtmlItem element, string content) { if (element != null) { element.AddToSite(content); } }
private static string GetValue(IHtmlItem htmlItem, IElement element) { var value = (string.IsNullOrEmpty(htmlItem.Attr) ? element.Text() : element.GetAttribute(htmlItem.Attr)).Trim(); if (!string.IsNullOrEmpty(htmlItem.RegexPattern)) { value = Regex.Match(value, htmlItem.RegexPattern).Groups[htmlItem.RegexGroup].Value; } return(value); }
/// <summary> /// Convert JToken object to corresponding IHtmlItem object (of specific type) and all descendants /// </summary> ///<param name="jToken">JToken object to convert</param> /// <returns>IHtmlItem instance</returns> /// <remarks>Processes all descentandts recursively</remarks> private static IHtmlItem ConvertFromJson(JToken jToken) { logger.Debug($"ConvertFromJson invoked with {jToken}]"); var m = _rxKeyFromPath.Match(jToken.Path); //find path (tag/attribute key) logger.Debug($"ConvertFromJson found {m} for {_rxKeyFromPath}"); var htmlItem = _htmlItemFactory.Resolve(m.Success ? m.Value : "document"); //root object (has no path, so we inject key) logger.Debug($"ConvertFromJson resolved {htmlItem} for {(m.Success ? m.Value : "document")}"); if (htmlItem == null) { logger.Warn($"ConvertFromJson could not resolve {m.Value}"); return(null); } switch (jToken.Type) { case JTokenType.Integer: //some attributes are integer (i.e. initial-scale) case JTokenType.String: htmlItem.SetValue(jToken.Value <string>()); break; case JTokenType.Object: foreach (var value in jToken.Values()) { IHtmlItem childItem = ConvertFromJson(value); if (childItem is HtmlTag) { ((HtmlTag)htmlItem).Children.Add((HtmlTag)childItem); } else if (childItem is HtmlAttribute) { ((HtmlTag)htmlItem).Attributes.Add(((HtmlAttribute)childItem)); } } break; } logger.Trace($"ConvertFromJson finished with {htmlItem}"); return(htmlItem); }
private static (IHtmlCollection <IElement> Elements, IHtmlItem HtmlItem) GetFirstOfDefaultNodes( IParentNode element, IEnumerable <IHtmlItem> attributes) { IHtmlCollection <IElement> node = null; IHtmlItem htmlItem = null; foreach (var attribute in attributes) { node = element.QuerySelectorAll(attribute.Path); if (node == null || !node.Any()) { continue; } htmlItem = attribute; break; } return(node, htmlItem); }
private static (IElement Element, IHtmlItem HtmlItem) GetFirstOfDefaultNode(IParentNode element, IEnumerable <IHtmlItem> attributes) { IElement node = null; IHtmlItem htmlItem = null; foreach (var attribute in attributes) { node = element.QuerySelector(attribute.Path); if (node == null) { continue; } htmlItem = attribute; break; } return(node, htmlItem); }
private static object GetTargetValue(IHtmlItem htmlItem, IElement element, Type targetType) { object targetValue = null; switch (Type.GetTypeCode(targetType)) { case TypeCode.Boolean: case TypeCode.Byte: case TypeCode.Char: case TypeCode.DateTime: case TypeCode.Decimal: case TypeCode.Double: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.SByte: case TypeCode.Single: case TypeCode.String: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: try { targetValue = Convert.ChangeType(GetValue(htmlItem, element), targetType); } catch { // ignored } break; case TypeCode.DBNull: case TypeCode.Empty: throw new NotSupportedException(); default: targetValue = DeserializeObject(element, targetType); break; } return(targetValue); }
private static (IElement Element, IHtmlItem HtmlItem) GetFirstOfDefaultNode(IParentNode element, IEnumerable <IHtmlItem> attributes) { IElement node = null; IHtmlItem htmlItem = null; foreach (var attribute in attributes) { node = element.QuerySelector(attribute.Selector); if (node == null || !string.IsNullOrEmpty(attribute.Attr) && !node.HasAttribute(attribute.Attr)) { continue; } htmlItem = attribute; break; } return(node, htmlItem); }
public void TestInvalidTag(string jsonInput, IHtmlItem htmlItem) { var item = JsonHtmlConverter.ConvertFromJson(jsonInput); Assert.Null(htmlItem); }
private static bool isText(IHtmlItem s) { if (s is HtmlText) return true; else return false; }
//DI przez konstruktor public MyHtmlSite(IHtmlItem item) { this.item = item; }