Esempio n. 1
0
        private Webpage Analyze()
        {
            Webpage    _webpage  = new Webpage();
            int        endOfFile = GetEndOfFile();
            HtmlObject htmlTag   = new HtmlObject();
            bool       inBetweenContentAfterClosedTagFound = false;
            string     inBetweenContentAfterClosedTag      = "";

            for (int i = 0; i < endOfFile - 1; i++)
            {
                switch (_content[i])
                {
                case '/':     // comment maybe /* */
                {
                    if (_content[++i] == '*')
                    {
                        while (_content[i].ToString() + _content[i + 1] != "*/")
                        {
                            i++;
                        }
                    }
                    break;
                }

                case '<':
                    //move one point forward cause right now it shows "<"
                    switch (_content[++i])
                    {
                    case '!':
                        i = SkipComment(i);
                        break;

                    case { } c when(char.IsLetter(c)):
                    {
                        if (htmlTag.Name != "")
                        {
                            _webpage.Add(htmlTag);
                            htmlTag = new HtmlObject();
                        }
                        Tuple <int, HtmlObject> values = GetOpeningTagName(i);
                        htmlTag = values.Item2;
                        i       = values.Item1;
                        if (inBetweenContentAfterClosedTagFound)
                        {
                            int result = GetInBetweenContentParent(_webpage, htmlTag);
                            if (result > 0)
                            {
                                try
                                {
                                    _webpage[result].Properties.Add("InBetweenContent", inBetweenContentAfterClosedTag);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e);
                                }
                            }
                            inBetweenContentAfterClosedTagFound = false;
                        }
                    }
                    break;

                    case '/':
                    {
                        if (htmlTag.Name != "")
                        {
                            _webpage.Add(htmlTag);
                        }
                        Tuple <int, string> values = GetClosingTagName(++i);
                        htmlTag = new HtmlObject(values.Item2, HtmlObjectType.ClosingTag);
                        i       = values.Item1;

                        if (inBetweenContentAfterClosedTagFound)
                        {
                            int result = GetInBetweenContentParent(_webpage, htmlTag);
                            if (result > 0)
                            {
                                HtmlObject obj = _webpage[result];
                                try
                                {
                                    _webpage[result].Properties.Add("InBetweenContent", inBetweenContentAfterClosedTag);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e);
                                }
                            }
                            inBetweenContentAfterClosedTagFound = false;
                        }
                    }
                    break;
                    }
                    break;

                //Create a case for the content inside <p>Hello</p>
                case '>':
                {
                    if (htmlTag.Type == HtmlObjectType.OpeningTag)
                    {
                        Tuple <int, string> values = GetInBetweenContent(i, endOfFile, htmlTag);
                        if (!String.IsNullOrWhiteSpace(values.Item2))
                        {
                            htmlTag.Properties.Add("InBetweenContent", values.Item2);
                        }
                        i = values.Item1;
                    }
                }
                break;

                //We are probably(?) reading a property
                case { } c when(Char.IsLetter(c)):
                {
                    if (htmlTag.Type == HtmlObjectType.OpeningTag)
                    {
                        Tuple <int, HtmlObject> values = GetProperties(i, endOfFile, htmlTag);
                        i       = values.Item1;
                        htmlTag = values.Item2;
                    }
                    else
                    {
                        // Temporary solution for skipping characters (i--)
                        i--;
                        Tuple <int, string> values = GetInBetweenContent(i, endOfFile);
                        if (!String.IsNullOrWhiteSpace(values.Item2))
                        {
                            inBetweenContentAfterClosedTagFound = true;
                            inBetweenContentAfterClosedTag      = values.Item2;
                        }
                        i = values.Item1;
                    }
                }
                break;
                }
            }
            if (!htmlTag.Name.Equals(""))
            {
                _webpage.Add(htmlTag);
            }
            return(_webpage);
        }