예제 #1
0
 void OnTagParsed(TagType tagtype, string id, TagAttributes attributes)
 {
     if (TagParsed != null)
     {
         TagParsed(this, tagtype, id, attributes);
     }
 }
예제 #2
0
        void parser_TagParsed(ILocation location, TagType tagtype, string id, TagAttributes attributes)
        {
            string tmp = "";

            if (String.Compare(id, "script", true) == 0)
            {
                if (tagtype == TagType.Tag)
                {
                    parser.VerbatimID = "script";
                }
            }

            switch (tagtype)
            {
            case TagType.Tag:
            case TagType.Text:
            case TagType.ServerComment:
            case TagType.SelfClosing:
            case TagType.Include:
            case TagType.DataBinding:
            case TagType.Close:
            case TagType.CodeRenderExpression:
                // AppendText(location.PlainText, true);
                AppendText(location.PlainText);
                break;

            case TagType.Directive:
                if (id.CompareTo("Import") == 0)
                {
                    eb.AppendNameSpace(attributes["Namespace"].ToString());
                }
                else if (id.CompareTo("Assembly") == 0)
                {
                    eb.AppendAssembly(attributes["Name"].ToString());
                }
                else if (id.CompareTo("SessionRequest") == 0)
                {
                    if (attributes["Check"] != null)
                    {
                        eb.AppendCodeIfAndReturn(m, "!CheckSession(false)");
                    }
                    else if (attributes["CheckAndCreate"] != null)
                    {
                        eb.AppendCodeIfAndReturn(m, "!CheckSession(true)");
                    }
                    else if (attributes["CheckManual"] != null)
                    {
                        break;
                    }
                }
                break;

            case TagType.CodeRender:
                AppendText(id, false);
                break;
            }
        }
예제 #3
0
        void GetServerTag(out TagType tagtype, out string id, out TagAttributes attributes)
        {
            string inside_tags;
            bool   old = tokenizer.ExpectAttrValue;

            tokenizer.ExpectAttrValue = false;
            if (Eat('@'))
            {
                tokenizer.ExpectAttrValue = old;
                tagtype = TagType.Directive;
                id      = "";
                if (Eat(Token.DIRECTIVE))
                {
                    id = tokenizer.Value;
                }

                attributes = GetAttributes();
                if (!Eat('%') || !Eat('>'))
                {
                    OnError("expecting '%>'");
                }

                return;
            }

            if (Eat(Token.DOUBLEDASH))
            {
                tokenizer.ExpectAttrValue = old;
                tokenizer.Verbatim        = true;
                inside_tags        = GetVerbatim(tokenizer.get_token(), "--%>");
                tokenizer.Verbatim = false;
                id         = null;
                attributes = null;
                tagtype    = TagType.ServerComment;
                return;
            }

            tokenizer.ExpectAttrValue = old;
            bool varname;
            bool databinding;

            varname     = Eat('=');
            databinding = !varname && Eat('#');

            tokenizer.Verbatim = true;
            inside_tags        = GetVerbatim(tokenizer.get_token(), "%>");
            tokenizer.Verbatim = false;
            id         = inside_tags;
            attributes = null;
            tagtype    = (databinding ? TagType.DataBinding :
                          (varname ? TagType.CodeRenderExpression : TagType.CodeRender));
        }
예제 #4
0
        void parser_TagParsed(ILocation location, TagType tagtype, string id, TagAttributes attributes)
        {
            switch (tagtype)
            {
            case TagType.CodeRender:
                parent.AppendText(id, false);
                break;

            default:
                parent.AppendText(location.PlainText);
                break;
            }
        }
예제 #5
0
        TagAttributes GetAttributes()
        {
            int           token;
            TagAttributes attributes;
            string        id;
            bool          wellFormedForServer = true;

            attributes = new TagAttributes();
            while ((token = tokenizer.get_token()) != Token.EOF)
            {
                if (token == '<' && Eat('%'))
                {
                    tokenizer.Verbatim = true;
                    attributes.Add("", "<%" +
                                   GetVerbatim(tokenizer.get_token(), "%>") + "%>");
                    tokenizer.Verbatim = false;
                    tokenizer.InTag    = true;
                    continue;
                }

                if (token != Token.IDENTIFIER)
                {
                    break;
                }

                id = tokenizer.Value;
                if (Eat('='))
                {
                    if (Eat(Token.ATTVALUE))
                    {
                        attributes.Add(id, tokenizer.Value);
                        wellFormedForServer &= tokenizer.AlternatingQuotes;
                    }
                    else if (Eat('<') && Eat('%'))
                    {
                        tokenizer.Verbatim = true;
                        attributes.Add(id, "<%" +
                                       GetVerbatim(tokenizer.get_token(), "%>") + "%>");
                        tokenizer.Verbatim = false;
                        tokenizer.InTag    = true;
                    }
                    else
                    {
                        OnError("expected ATTVALUE");
                        return(null);
                    }
                }
                else
                {
                    attributes.Add(id, null);
                }
            }

            tokenizer.put_back();

            if (attributes.IsRunAtServer() && !wellFormedForServer)
            {
                OnError("The server tag is not well formed.");
                return(null);
            }

            return(attributes);
        }
예제 #6
0
        void GetTag(out TagType tagtype, out string id, out TagAttributes attributes)
        {
            int token = tokenizer.get_token();

            tagtype    = TagType.ServerComment;
            id         = null;
            attributes = null;
            switch (token)
            {
            case '%':
                GetServerTag(out tagtype, out id, out attributes);
                break;

            case '/':
                if (!Eat(Token.IDENTIFIER))
                {
                    OnError("expecting TAGNAME");
                }

                id = tokenizer.Value;
                if (!Eat('>'))
                {
                    OnError("expecting '>'. Got '" + id + "'");
                }

                tagtype = TagType.Close;
                break;

            case '!':
                bool double_dash = Eat(Token.DOUBLEDASH);
                if (double_dash)
                {
                    tokenizer.put_back();
                }

                tokenizer.Verbatim = true;
                string end     = double_dash ? "-->" : ">";
                string comment = GetVerbatim(tokenizer.get_token(), end);
                tokenizer.Verbatim = false;
                if (comment == null)
                {
                    OnError("Unfinished HTML comment/DTD");
                }

                string pathType, filename;
                if (double_dash && GetInclude(comment, out pathType, out filename))
                {
                    tagtype    = TagType.Include;
                    attributes = new TagAttributes();
                    attributes.Add(pathType, filename);
                }
                else
                {
                    tagtype = TagType.Text;
                    id      = "<!" + comment + end;
                }
                break;

            case Token.IDENTIFIER:
                if (this.filename == "@@inner_string@@")
                {
                    // Actually not tag but "xxx < yyy" stuff in inner_string!
                    tagtype         = TagType.Text;
                    tokenizer.InTag = false;
                    id = "<" + tokenizer.Odds + tokenizer.Value;
                }
                else
                {
                    id = tokenizer.Value;
                    try
                    {
                        attributes = GetAttributes();
                    }
                    catch (Exception e)
                    {
                        OnError(e.Message);
                        break;
                    }

                    tagtype = TagType.Tag;
                    if (Eat('/') && Eat('>'))
                    {
                        tagtype = TagType.SelfClosing;
                    }
                    else if (!Eat('>'))
                    {
                        if (attributes.IsRunAtServer())
                        {
                            OnError("The server tag is not well formed.");
                            break;
                        }
                        tokenizer.Verbatim = true;
                        attributes.Add("", GetVerbatim(tokenizer.get_token(), ">") + ">");
                        tokenizer.Verbatim = false;
                    }
                }

                break;

            default:
                tagtype         = TagType.Text;
                tokenizer.InTag = false;
                id = "<" + tokenizer.Value;
                break;
            }
        }