Esempio n. 1
0
        public void Parse(TextElement baseitem, string text)
        {
            this.Text = text;
            this.Evulator.IsParseMode = true;
            TextElement currenttag = null;

            if (baseitem == null)
            {
                currenttag = this.Evulator.Elements;
            }
            else
            {
                currenttag = baseitem;
            }
            currenttag.BaseEvulator = this.Evulator;
            for (int i = 0; i < TextLength; i++)
            {
                TextElement tag = this.ParseTag(i, currenttag);
                if (tag == null)
                {
                    i = this.pos;
                    continue;
                }

                if (!tag.SlashUsed)
                {
                    currenttag.AddElement(tag);
                    if (tag.DirectClosed)
                    {
                        this.Evulator.OnTagClosed(tag);
                    }
                }
                if (tag.SlashUsed)
                {
                    TextElement prevtag = this.GetNotClosedPrevTag(tag);
                    //$alltags = $this->GetNotClosedPrevTagUntil($tag, $tag->elemName);
                    // int total = 0;
                    /** @var TextElement $baseitem */
                    TextElement previtem = null;
                    while (prevtag != null)
                    {
                        if (!prevtag.NameEquals(tag.ElemName, true))
                        {
                            var elem = new TextElement
                            {
                                ElemName     = prevtag.ElemName,
                                ElemAttr     = prevtag.ElemAttr.CloneWCS(),
                                AutoAdded    = true,
                                BaseEvulator = this.Evulator
                            };
                            prevtag.Closed = true;

                            if (previtem != null)
                            {
                                previtem.Parent = elem;
                                elem.AddElement(previtem);
                            }
                            else
                            {
                                currenttag = elem;
                            }
                            previtem = elem;
                        }
                        else
                        {
                            if (prevtag.ElemName != tag.ElemName)
                            {
                                prevtag.AliasName = tag.ElemName;
                                //Alias
                            }
                            if (previtem != null)
                            {
                                previtem.Parent = prevtag.Parent;
                                previtem.Parent.AddElement(previtem);
                            }
                            else
                            {
                                currenttag = prevtag.Parent;
                            }
                            prevtag.Closed = true;
                            break;
                        }
                        prevtag = this.GetNotClosedPrevTag(prevtag);
                    }
                    if (prevtag == null && this.Evulator.ThrowExceptionIFPrevIsNull)
                    {
                        this.Evulator.IsParseMode = false;
                        throw new Exception("Syntax Error");
                    }
                }
                else if (!tag.Closed)
                {
                    currenttag = tag;
                }


                i = this.pos;
            }
            this.pos                  = 0;
            this.in_noparse           = false;
            this.Evulator.IsParseMode = false;
        }
Esempio n. 2
0
        private void ParseTagHeader(ref TextElement tagElement)
        {
            bool          inquot    = false;
            bool          inspec    = false;
            StringBuilder current   = new StringBuilder();
            bool          namefound = false;
            //bool inattrib = false;
            bool          firstslashused = false;
            bool          lastslashused  = false;
            StringBuilder currentName    = new StringBuilder();

#pragma warning disable CS0219 // Değişken atandı ancak değeri hiç kullanılmadı
            bool quoted = false;
#pragma warning restore CS0219 // Değişken atandı ancak değeri hiç kullanılmadı
            char quotchar = '\0';
            bool initial  = false;
            for (int i = this.pos; i < this.TextLength; i++)
            {
                var cur = this.Text[i];


                if (inspec)
                {
                    inspec = false;
                    current.Append(cur);
                    continue;
                }
                var next  = '\0';
                var next2 = '\0';
                if (i + 1 < this.TextLength)
                {
                    next = this.Text[i + 1];
                }
                if (i + 2 < this.TextLength)
                {
                    next2 = this.Text[i + 2];
                }
                if (tagElement.ElementType == TextElementType.CDATASection)
                {
                    if (cur == ']' && next == ']' && next2 == this.Evulator.RightTag)
                    {
                        tagElement.Value = current.ToString();
                        this.pos         = i += 2;
                        return;
                    }
                    current.Append(cur);
                    continue;
                }
                if (this.Evulator.AllowXMLTag && cur == '?' && !namefound && current.Length == 0)
                {
                    tagElement.Closed      = true;
                    tagElement.AutoClosed  = true;
                    tagElement.ElementType = TextElementType.XMLTag;
                    continue;
                }
                if (this.Evulator.SupportExclamationTag && cur == '!' && !namefound && current.Length == 0)
                {
                    tagElement.Closed     = true;
                    tagElement.AutoClosed = true;
                    if (i + 8 < this.TextLength)
                    {
                        var mtn = this.Text.Substring(i, 8);
                        if (this.Evulator.SupportCDATA && mtn == "![CDATA[")
                        {
                            tagElement.ElementType = TextElementType.CDATASection;
                            tagElement.ElemName    = "#cdata";
                            namefound = true;
                            i        += 7;
                            continue;
                        }
                    }
                }
                if (cur == '\\' && tagElement.ElementType != TextElementType.CommentNode)
                {
                    if (!namefound && tagElement.ElementType != TextElementType.Parameter)
                    {
                        this.Evulator.IsParseMode = false;
                        throw new Exception("Syntax Error");
                    }
                    inspec = true;
                    continue;
                }

                if (!initial && cur == '!' && next == '-' && next2 == '-')
                {
                    tagElement.ElementType = TextElementType.CommentNode;
                    tagElement.ElemName    = "#summary";
                    tagElement.Closed      = true;
                    i += 2;
                    continue;
                }
                if (tagElement.ElementType == TextElementType.CommentNode)
                {
                    if (cur == '-' && next == '-' && next2 == this.Evulator.RightTag)
                    {
                        tagElement.Value = current.ToString();
                        this.pos         = i + 2;
                        return;
                    }
                    else
                    {
                        current.Append(cur);
                    }
                    continue;
                }
                initial = true;
                if (this.Evulator.DecodeAmpCode && tagElement.ElementType != TextElementType.CommentNode && cur == '&')
                {
                    current.Append(this.DecodeAmp(i + 1));
                    i = this.pos;
                    continue;
                }

                if (tagElement.ElementType == TextElementType.Parameter && this.Evulator.ParamNoAttrib)
                {
                    if (cur != this.Evulator.RightTag)
                    {
                        current.Append(cur);
                        continue;
                    }
                }
                if (namefound && tagElement.NoAttrib)
                {
                    if (cur != this.Evulator.RightTag)
                    {
                        current.Append(cur);
                        continue;
                    }
                }
                if (firstslashused && namefound)
                {
                    if (cur != this.Evulator.RightTag)
                    {
                        if (cur == ' ' && next != '\t' && next != ' ')
                        {
                            this.Evulator.IsParseMode = false;
                            throw new Exception("Syntax Error");
                        }
                    }
                }
                if (cur == '"' || cur == '\'')
                {
                    if (!namefound || currentName.Length == 0)
                    {
                        this.Evulator.IsParseMode = false;
                        throw new Exception("Syntax Error");
                    }
                    if (inquot && cur == quotchar)
                    {
                        if (currentName.ToString() == "##set_TAG_ATTR##")
                        {
                            tagElement.TagAttrib = current.ToString();
                        }
                        else if (currentName.Length > 0)
                        {
                            tagElement.ElemAttr.SetAttribute(currentName.ToString(), current.ToString());
                        }
                        currentName.Clear();
                        current.Clear();
                        inquot = false;
                        quoted = true;
                        continue;
                    }
                    else if (!inquot)
                    {
                        quotchar = cur;
                        inquot   = true;
                        continue;
                    }
                }
                if (!inquot)
                {
                    if (cur == this.Evulator.ParamChar && !namefound && !firstslashused)
                    {
                        tagElement.ElementType = TextElementType.Parameter;
                        tagElement.Closed      = true;
                        continue;
                    }
                    if (cur == '/')
                    {
                        if (!namefound && current.Length > 0)
                        {
                            namefound           = true;
                            tagElement.ElemName = current.ToString();
                            current.Clear();
                        }
                        if (namefound)
                        {
                            lastslashused = true;
                        }
                        else
                        {
                            firstslashused = true;
                        }
                        continue;
                    }
                    if (cur == '=')
                    {
                        if (namefound)
                        {
                            if (current.Length == 0)
                            {
                                this.Evulator.IsParseMode = false;
                                throw new Exception("Syntax Error");
                            }
                            currentName.Clear();
                            currentName.Append(current.ToString());
                            current.Clear();
                        }
                        else
                        {
                            namefound           = true;
                            tagElement.ElemName = current.ToString();
                            current.Clear();
                            currentName.Clear();
                            currentName.Append("##set_TAG_ATTR##");
                        }
                        continue;
                    }
                    if (tagElement.ElementType == TextElementType.XMLTag)
                    {
                        if (cur == '?' && next == this.Evulator.RightTag)
                        {
                            cur = next;
                            i++;
                        }
                    }

                    if (cur == this.Evulator.LeftTag)
                    {
                        this.Evulator.IsParseMode = false;
                        throw new Exception("Syntax Error");
                    }
                    if (cur == this.Evulator.RightTag)
                    {
                        if (!namefound)
                        {
                            tagElement.ElemName = current.ToString();
                            current.Clear();
                        }
                        if (tagElement.NoAttrib)
                        {
                            tagElement.Value = current.ToString();
                        }
                        else if (currentName.ToString() == "##set_TAG_ATTR##")
                        {
                            tagElement.TagAttrib = current.ToString();
                        }
                        else if (currentName.Length > 0)
                        {
                            tagElement.SetAttribute(currentName.ToString(), current.ToString());
                        }
                        else if (current.Length > 0)
                        {
                            tagElement.SetAttribute(current.ToString(), null);
                        }
                        tagElement.SlashUsed = firstslashused;
                        if (lastslashused)
                        {
                            tagElement.DirectClosed = true;
                            tagElement.Closed       = true;
                        }
                        string elname = tagElement.ElemName.ToLowerInvariant();
                        if (this.Evulator.AutoClosedTags.Any(e => e.ToLowerInvariant() == elname))
                        {
                            tagElement.Closed     = true;
                            tagElement.AutoClosed = true;
                        }
                        this.pos = i;
                        return;
                    }
                    if (cur == ' ')
                    {
                        if (next == ' ' || next == '\t' || next == this.Evulator.RightTag)
                        {
                            continue;
                        }
                        if (!namefound && !PhpFuctions.empty(current))
                        {
                            namefound           = true;
                            tagElement.ElemName = current.ToString();
                            current.Clear();
                        }
                        else if (namefound)
                        {
                            if (currentName.ToString() == "##set_TAG_ATTR##")
                            {
                                tagElement.TagAttrib = current.ToString();
                                quoted = false;
                                currentName.Clear();
                                current.Clear();
                            }
                            else if (!PhpFuctions.empty(currentName))
                            {
                                tagElement.SetAttribute(currentName.ToString(), current.ToString());
                                currentName.Clear();
                                current.Clear();
                                quoted = false;
                            }
                            else if (!PhpFuctions.empty(current))
                            {
                                tagElement.SetAttribute(current.ToString(), null);
                                current.Clear();
                                quoted = false;
                            }
                        }
                        continue;
                    }
                }
                current.Append(cur);
            }
            this.pos = this.TextLength;
        }
Esempio n. 3
0
        public void Parse(TextElement baselement, string text)
        {
            var parser = new TextEvulatorParser(this);

            parser.Parse(baselement, text);
        }
Esempio n. 4
0
        private TextElement ParseTag(int start, TextElement parent = null)
        {
            bool        inspec     = false;
            TextElement tagElement = new TextElement
            {
                Parent       = parent,
                BaseEvulator = this.Evulator
            };
            bool istextnode = false;
            bool intag      = false;

            for (int i = start; i < this.TextLength; i++)
            {
                if (this.Evulator.NoParseEnabled && this.in_noparse)
                {
                    istextnode             = true;
                    tagElement.ElemName    = "#text";
                    tagElement.ElementType = TextElementType.TextNode;
                    tagElement.Closed      = true;
                }
                else
                {
                    var cur = this.Text[i];
                    if (!inspec)
                    {
                        if (cur == this.Evulator.LeftTag)
                        {
                            if (intag)
                            {
                                this.Evulator.IsParseMode = false;
                                throw new Exception("Syntax Error");
                            }
                            intag = true;
                            continue;
                        }
                        else if (this.Evulator.DecodeAmpCode && cur == '&')
                        {
                            string ampcode = this.DecodeAmp(i + 1, false);
                            i = this.pos;
                            if (ampcode.StartsWith("&"))
                            {
                                this.Evulator.IsParseMode = false;
                                throw new Exception("Syntax Error");
                            }
                            tagElement.AutoClosed  = true;
                            tagElement.Closed      = true;
                            tagElement.Value       = ampcode;
                            tagElement.ElementType = TextElementType.EntityReferenceNode;
                            tagElement.ElemName    = "#text";
                            return(tagElement);
                        }
                        else
                        {
                            if (!intag)
                            {
                                istextnode             = true;
                                tagElement.ElemName    = "#text";
                                tagElement.ElementType = TextElementType.TextNode;
                                tagElement.Closed      = true;
                            }
                        }
                    }
                    if (!inspec && cur == this.Evulator.RightTag)
                    {
                        if (!intag)
                        {
                            this.Evulator.IsParseMode = false;
                            throw new Exception("Syntax Error");
                        }
                        intag = false;
                    }
                }
                this.pos = i;
                if (!intag || istextnode)
                {
                    tagElement.Value = this.ParseInner();
                    if (!this.in_noparse && tagElement.ElementType == TextElementType.TextNode && string.IsNullOrEmpty(tagElement.Value))
                    {
                        return(null);
                    }
                    intag = false;
                    if (this.in_noparse)
                    {
                        parent.AddElement(tagElement);
                        var elem = new TextElement
                        {
                            Parent    = parent,
                            ElemName  = this.Evulator.NoParseTag,
                            SlashUsed = true
                        };
                        this.in_noparse = false;
                        return(elem);
                    }
                    return(tagElement);
                }
                else
                {
                    this.ParseTagHeader(ref tagElement);
                    intag = false;
                    if (this.Evulator.NoParseEnabled && tagElement.ElemName == this.Evulator.NoParseTag)
                    {
                        this.in_noparse = true;
                    }
                    return(tagElement);
                }
            }
            return(tagElement);
        }
Esempio n. 5
0
 public void AddElement(TextElement element)
 {
     element.Index = this.SubElements.Count;
     this.SubElements.Add(element);
 }