private HtmlElementsCollection GetHtmlFormGroups()
        {
            HtmlElementsCollection formElements = new HtmlElementsCollection();

            PropertyInfo[] propertiesInfo = _options.Model.GetType().GetProperties();

            foreach (var propInfo in propertiesInfo)
            {
                bool isSourceProperty = propertiesInfo.Any(
                    prop => prop.GetCustomAttributes().Any(
                        attr => attr.GetType().GetProperty(nameof(IHtmlMultipleValuesInputAttribute.SourceProperty))?.GetValue(attr) == propInfo.Name));

                // TODO Test
                if (propInfo.GetCustomAttribute <IgonreUIAttribute>() != null || isSourceProperty)
                {
                    continue;
                }

                // if Type is class, should generate inputs for him properties
                if (!propInfo.PropertyType.IsPrimitive && propInfo.PropertyType != typeof(string) && propInfo.PropertyType != typeof(DateTime))
                {
                    //foreach (var fieldSet in GetHtmlFormFiledSets<T>(definition))
                    //    formFieldSets.Add(fieldSet);
                }

                if (propInfo.GetCustomAttribute <HiddenAttribute>() != null)
                {
                    formElements.Add(GetProperInput(propInfo));
                }
                else
                {
                    formElements.Add(GetFormGroup(propInfo));
                }
            }

            return(formElements);
        }
        public void AppendRange_ShouldAppendChilrendAndSetHimParrent_WhenAppendSomeChildren()
        {
            // Arrange
            HtmlNodeElement        element = new HtmlNodeElement("div");
            HtmlElementsCollection htmlElementsCollection = new HtmlElementsCollection();

            htmlElementsCollection.Add(new HtmlDivElement());
            htmlElementsCollection.Add(new HtmlSpanElement());
            htmlElementsCollection.Add(new HtmlInputElement());
            htmlElementsCollection.Add(new HtmlPElement());
            htmlElementsCollection.Add(new HtmlH1Element());
            htmlElementsCollection.Add(new HtmlH2Element());

            // Act
            element.AppendRange(htmlElementsCollection);

            // Assert
            Assert.NotNull(element.Children);
            Assert.NotEmpty(element.Children);
            Assert.False(htmlElementsCollection.Any(x => x.Parents.FirstOrDefault().UId != element.UId));
        }
示例#3
0
        public IHtmlElementsCollection ParseElements(int startIndex, int endIndex)
        {
            IHtmlElementsCollection elements = new HtmlElementsCollection();

            // get all matches in current range
            List <Match> startTagMatchesInCurrentRange     = _startTagsMathes.Where(x => x.Index >= startIndex && x.Index < endIndex).ToList();
            List <Match> pairStartTagMatchesInCurrentRange = _pairStartTagsMathes.Where(x => x.Index >= startIndex && x.Index < endIndex).ToList();
            List <Match> endTagMatchesInCurrentRange       = _endTagsMathes.Where(x => x.Index > startIndex && x.Index < endIndex).ToList();

            try
            {
                // get root start tags in current range
                List <Match> rootStartTagMatches = startTagMatchesInCurrentRange
                                                   .Where(currentStartTag =>
                                                          pairStartTagMatchesInCurrentRange
                                                          .Count(startTag => startTag.Index < currentStartTag.Index) == endTagMatchesInCurrentRange.Count(endTag => endTag.Index <= currentStartTag.Index)
                                                          )
                                                   .ToList();
                // get root end tags in current range
                List <Match> rootEndTagMatches = endTagMatchesInCurrentRange
                                                 .Where(currentEndTag =>
                                                        pairStartTagMatchesInCurrentRange
                                                        .Count(startTag => startTag.Index < currentEndTag.Index) == endTagMatchesInCurrentRange.Count(endTag2 => endTag2.Index <= currentEndTag.Index)
                                                        )
                                                 .ToList();

                // create IHtmlElement for every start tag match and add to collection
                foreach (Match startTagMatch in rootStartTagMatches)
                {
                    // get tag name
                    string tagName = _htmlHelper.ExtractTagNameFromStartTag(startTagMatch.Value);

                    // parse attributes
                    HtmlAttributesCollection attributes = ParseAttributes(startTagMatch.Value);

                    // if tag is self closing
                    if (_htmlHelper.IsSelfClosingHtmlTag(tagName))
                    {
                        // create elements factory
                        IHtmlSelfClosingTagElementFactory htmlElementsFactory;
                        switch (tagName.ToLower())
                        {
                        case "!doctype":
                            htmlElementsFactory = new HtmlDoctypeElementFactory();
                            break;

                        default:
                            htmlElementsFactory = new HtmlSelfClosingTagElementFactory(tagName);
                            break;
                        }

                        // create element
                        IHtmlElement element = htmlElementsFactory.Create(attributes, _encodedHtml, this);
                        // add
                        elements.Add(element);
                    }
                    // when tag have pair tags
                    else
                    {
                        // create elements factory
                        IHtmlPairTagsElementFactory htmlElementsFactory;
                        switch (tagName.ToLower())
                        {
                        case "noscript":
                            htmlElementsFactory = new HtmlNoScriptElementFactory();
                            break;

                        case "script":
                            htmlElementsFactory = new HtmlScriptElementFactory();
                            break;

                        case "style":
                            htmlElementsFactory = new HtmlStyleElementFactory();
                            break;

                        case "code":
                            htmlElementsFactory = new HtmlCodeElementFactory();
                            break;

                        default:
                            htmlElementsFactory = new HtmlNodeElementFactory(tagName);
                            break;
                        }

                        // find start content index
                        int startContentIndex = startTagMatch.Index + startTagMatch.Value.Length;

                        // find cloing tang on current star tag
                        Match endTagMatch = rootEndTagMatches.FirstOrDefault(x => x.Index > startTagMatch.Index);
                        // in html may have tags which should have end tag but he is not defined, in this case just skip him as set end index to be end index on current start tag
                        int endContentIndex = startTagMatch.Index + startTagMatch.Value.Length;
                        if (endTagMatch != null)
                        {
                            endContentIndex = endTagMatch.Index;
                        }

                        // create element
                        IHtmlElement element = htmlElementsFactory.Create(attributes, _encodedHtml, startContentIndex, endContentIndex, this);

                        // add
                        elements.Add(element);
                    }
                }
            }
            catch (Exception ex)
            {
                return(elements);
            }

            return(elements);
        }