public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _classid, _classname;
     exp = tag.AttributeValue("classid");
     if (exp == null)
         throw new Exception("没有classid标签");
     _classid = manager.EvalExpression(exp).ToString();
     // _classname = (new JumboTCMS.DAL.Normal_ClassDAL().GetClassName(_classid));
     manager.WriteValue("");
 }
        public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
        {
            Expression exp;
            string _channelid, _channelishtml, _classid, _classlink;
            exp = tag.AttributeValue("channelid");
            if (exp == null)
                throw new Exception("没有channelid标签");
            _channelid = manager.EvalExpression(exp).ToString();

            exp = tag.AttributeValue("channelishtml");
            if (exp == null)
                _channelishtml = "0";
            _channelishtml = manager.EvalExpression(exp).ToString();

            exp = tag.AttributeValue("classid");
            if (exp == null)
                throw new Exception("没有classid标签");
            _classid = manager.EvalExpression(exp).ToString();
            // _classlink = (new Normal_ClassDAL()).GetClassLink(1, _channelishtml == "1", _channelid, _classid, false);
            manager.WriteValue("");
        }
        protected void ProcessTemplate(string name, Tag tag)
        {
            if (customTags != null && customTags.ContainsKey(name))
            {
                ExecuteCustomTag(tag);
                return;
            }

            Template useTemplate = currentTemplate.FindTemplate(name);
            if (useTemplate == null)
            {
                string msg = string.Format("Template '{0}' not found", name);
                throw new TemplateRuntimeException(msg, tag.Line, tag.Col);
            }

            // process inner elements and save content
            TextWriter saveWriter = writer;
            writer = new StringWriter();
            string content = string.Empty;

            try
            {
                ProcessElements(tag.InnerElements);

                content = writer.ToString();
            }
            finally
            {
                writer = saveWriter;
            }

            Template saveTemplate = currentTemplate;
            variables = new VariableScope(variables);
            variables["innerText"] = content;

            try
            {
                foreach (TagAttribute attrib in tag.Attributes)
                {
                    object val = EvalExpression(attrib.Expression);
                    variables[attrib.Name] = val;
                }

                currentTemplate = useTemplate;
                ProcessElements(currentTemplate.Elements);
            }
            finally
            {
                variables = variables.Parent;
                currentTemplate = saveTemplate;
            }
        }
        protected void ProcessTagSet(Tag tag)
        {
            Expression expName = tag.AttributeValue("name");
            if (expName == null)
            {
                throw new TemplateRuntimeException("Set is missing required attribute: name", tag.Line, tag.Col);
            }

            Expression expValue = tag.AttributeValue("value");
            if (expValue == null)
            {
                throw new TemplateRuntimeException("Set is missing required attribute: value", tag.Line, tag.Col);
            }

            string name = EvalExpression(expName).ToString();
            if (!Util.IsValidVariableName(name))
                throw new TemplateRuntimeException("'" + name + "' is not valid variable name.", expName.Line, expName.Col);

            object value = EvalExpression(expValue);

            this.SetValue(name, value);
        }
        protected void ProcessTag(Tag tag)
        {
            string name = tag.Name.ToLowerInvariant();
            try
            {
                switch (name)
                {
                    case "template":
                        // skip those, because those are processed first
                        break;
                    case "else":
                        ProcessElements(tag.InnerElements);
                        break;
                    case "apply":
                        object val = EvalExpression(tag.AttributeValue("template"));
                        ProcessTemplate(val.ToString(), tag);
                        break;
                    case "foreach":
                        ProcessForEach(tag);
                        break;
                    case "for":
                        ProcessFor(tag);
                        break;
                    case "set":
                        ProcessTagSet(tag);
                        break;
                    default:
                        ProcessTemplate(tag.Name, tag);
                        break;
                }
            }
            catch (TemplateRuntimeException ex)
            {
                DisplayError(ex);
            }
            catch (Exception ex)
            {
                DisplayError("Error executing tag '" + name + "': " + ex.Message, tag.Line, tag.Col);

            }
        }
        protected void ProcessForEach(Tag tag)
        {
            Expression expCollection = tag.AttributeValue("collection");
            if (expCollection == null)
            {
                throw new TemplateRuntimeException("Foreach is missing required attribute: collection", tag.Line, tag.Col);
            }

            object collection = EvalExpression(expCollection);
            if (!(collection is IEnumerable))
            {
                throw new TemplateRuntimeException("Collection used in foreach has to be enumerable", tag.Line, tag.Col);
            }

            Expression expVar = tag.AttributeValue("var");
            if (expCollection == null)
            {
                throw new TemplateRuntimeException("Foreach is missing required attribute: var", tag.Line, tag.Col);
            }
            object varObject = EvalExpression(expVar);
            if (varObject == null)
                varObject = "foreach";
            string varname = varObject.ToString();

            Expression expIndex = tag.AttributeValue("index");
            string indexname = null;
            if (expIndex != null)
            {
                object obj = EvalExpression(expIndex);
                if (obj != null)
                    indexname = obj.ToString();
            }

            IEnumerator ienum = ((IEnumerable)collection).GetEnumerator();
            int index = 0;
            while (ienum.MoveNext())
            {
                index++;
                object value = ienum.Current;
                variables[varname] = value;
                if (indexname != null)
                    variables[indexname] = index;

                ProcessElements(tag.InnerElements);
            }
        }
        protected void ProcessFor(Tag tag)
        {
            Expression expFrom = tag.AttributeValue("from");
            if (expFrom == null)
            {
                throw new TemplateRuntimeException("For is missing required attribute: start", tag.Line, tag.Col);
            }

            Expression expTo = tag.AttributeValue("to");
            if (expTo == null)
            {
                throw new TemplateRuntimeException("For is missing required attribute: to", tag.Line, tag.Col);
            }

            Expression expIndex = tag.AttributeValue("index");
            if (expIndex == null)
            {
                throw new TemplateRuntimeException("For is missing required attribute: index", tag.Line, tag.Col);
            }

            object obj = EvalExpression(expIndex);
            string indexName = obj.ToString();

            int start = Convert.ToInt32(EvalExpression(expFrom));
            int end = Convert.ToInt32(EvalExpression(expTo));

            for (int index = start; index <= end; index++)
            {
                SetValue(indexName, index);
                //variables[indexName] = index;

                ProcessElements(tag.InnerElements);
            }
        }
        protected void ExecuteCustomTag(Tag tag)
        {
            ITagHandler tagHandler = customTags[tag.Name];

            bool processInnerElements = true;
            bool captureInnerContent = false;

            tagHandler.TagBeginProcess(this, tag, ref processInnerElements, ref captureInnerContent);

            string innerContent = null;

            if (processInnerElements)
            {
                TextWriter saveWriter = writer;

                if (captureInnerContent)
                    writer = new StringWriter();

                try
                {
                    ProcessElements(tag.InnerElements);

                    innerContent = writer.ToString();
                }
                finally
                {
                    writer = saveWriter;
                }
            }

            tagHandler.TagEndProcess(this, tag, innerContent);
        }
Example #9
0
        private Tag CollectForTag(Tag tag, ref int index)
        {
            if (tag.IsClosed) // if self-closing tag, do not collect inner elements
            {
                return tag;
            }

            if (string.Compare(tag.Name, "if", true) == 0)
            {
                tag = new TagIf(tag.Line, tag.Col, tag.AttributeValue("test"));
            }

            Tag collectTag = tag;

            for (index++; index < elements.Count; index++)
            {
                Element elem = elements[index];

                if (elem is Text)
                    collectTag.InnerElements.Add(elem);
                else if (elem is Expression)
                    collectTag.InnerElements.Add(elem);
                else if (elem is Tag)
                {
                    Tag innerTag = (Tag)elem;
                    if (string.Compare(innerTag.Name, "else", true) == 0)
                    {
                        if (collectTag is TagIf)
                        {
                            ((TagIf)collectTag).FalseBranch = innerTag;
                            collectTag = innerTag;
                        }
                        else
                            throw new ParseException("else tag has to be positioned inside of if or elseif tag", innerTag.Line, innerTag.Col);

                    }
                    else if (string.Compare(innerTag.Name, "elseif", true) == 0)
                    {
                        if (collectTag is TagIf)
                        {
                            Tag newTag = new TagIf(innerTag.Line, innerTag.Col, innerTag.AttributeValue("test"));
                            ((TagIf)collectTag).FalseBranch = newTag;
                            collectTag = newTag;
                        }
                        else
                            throw new ParseException("elseif tag is not positioned properly", innerTag.Line, innerTag.Col);
                    }
                    else
                        collectTag.InnerElements.Add(CollectForTag(innerTag, ref index));
                }
                else if (elem is TagClose)
                {
                    TagClose tagClose = (TagClose)elem;
                    if (string.Compare(tag.Name, tagClose.Name, true) == 0)
                        return tag;

                    throw new ParseException("Close tag for " + tagClose.Name + " doesn't have matching start tag.", elem.Line, elem.Col);
                }
                else
                    throw new ParseException("Invalid element: " + elem.GetType().ToString(), elem.Line, elem.Col);

            }

            throw new ParseException("Start tag: " + tag.Name + " does not have matching end tag.", tag.Line, tag.Col);
        }
 public void TagBeginProcess(TemplateManager manager, Tag tag, ref bool processInnerElements, ref bool captureInnerContent)
 {
     processInnerElements = true;
     captureInnerContent = true;
 }
 public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _sitedir, _channelid, _channeltype, _contentid, _viewnum;
     exp = tag.AttributeValue("sitedir");
     if (exp == null)
         throw new Exception("没有sitedir标签");
     _sitedir = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("channelid");
     if (exp == null)
         throw new Exception("没有channelid标签");
     _channelid = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("channeltype");
     if (exp == null)
         throw new Exception("没有channeltype标签");
     _channeltype = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("contentid");
     if (exp == null)
         throw new Exception("没有contentid标签");
     _contentid = manager.EvalExpression(exp).ToString();
     _viewnum = "<script src=\"" + _sitedir + "plus/viewcount.aspx?ccid=" + _channelid + "&cType=" + _channeltype + "&id=" + _contentid + "&addit=0\"></script>";
     manager.WriteValue(_viewnum);
 }
 public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _sitedir, _isimg, _img, _imgurl;
     exp = tag.AttributeValue("sitedir");
     if (exp == null)
         throw new Exception("没有sitedir标签");
     _sitedir = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("isimg");
     if (exp == null)
         _isimg = "0";
     else
         _isimg = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("img");
     if (exp == null)
         _img = "";
     else
         _img = manager.EvalExpression(exp).ToString();
     if (_isimg == "0" && _img.Length == 0)
         _imgurl = _sitedir + "no.png";
     else
         _imgurl = _img;
     manager.WriteValue(_imgurl);
 }
 public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _title, _formattitle;
     exp = tag.AttributeValue("title");
     if (exp == null)
         throw new Exception("没有title标签");
     _title = manager.EvalExpression(exp).ToString();
     _formattitle = WeiXin.Core.Strings.HtmlEncode(_title);
     manager.WriteValue(_formattitle);
 }
 public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _len, _cutstring;
     exp = tag.AttributeValue("len");
     if (exp == null)
         throw new Exception("没有len标签");
     _len = manager.EvalExpression(exp).ToString();
     //_cutstring = JumboTCMS.Utils.Strings.CutString(JumboTCMS.Utils.Strings.NoHTML(innerContent), Convert.ToInt32(_len));
     //  manager.WriteValue(_cutstring);
 }
 public void TagEndProcess(TemplateManager manager, Tag tag, string innerContent)
 {
     Expression exp;
     string _channelid, _contentid, _contenturl, _contentlink;
     exp = tag.AttributeValue("channelid");
     if (exp == null)
         throw new Exception("没有channelid标签");
     _channelid = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("contentid");
     if (exp == null)
         throw new Exception("没有contentid标签");
     _contentid = manager.EvalExpression(exp).ToString();
     exp = tag.AttributeValue("contenturl");
     if (exp == null)
         throw new Exception("没有contenturl标签");
     _contenturl = manager.EvalExpression(exp).ToString();
     //查询频道信息,获取频道模型,
     normal_channelService channelBll = new normal_channelService();
     DataSet ds = channelBll.GetChannelBySql("select  eid,Type from [normal_channel] where id=" + _channelid);
     string eid = ds.Tables[0].Rows[0]["eid"].ToString();
     string Type = ds.Tables[0].Rows[0]["Type"].ToString();
     _contentlink = "/Enterprise/Web/" + Type + "/" + _contentid + "?sessionid=" + WeiXin.Core.SecurityEncryption.DESEncrypt(eid);
     manager.WriteValue(_contentlink);
 }
        Tag ReadTag()
        {
            Consume(TokenKind.TagStart);
            Token name = Consume(TokenKind.ID);
            Tag tag = new Tag(name.Line, name.Col, name.Data);

            while (true)
            {
                if (Current.TokenKind == TokenKind.ID)
                    tag.Attributes.Add(ReadAttribute());
                else if (Current.TokenKind == TokenKind.TagEnd)
                {
                    Consume();
                    break;
                }
                else if (Current.TokenKind == TokenKind.TagEndClose)
                {
                    Consume();
                    tag.IsClosed = true;
                    break;
                }
                else
                    throw new ParseException("Invalid token in tag: " + Current.TokenKind, Current.Line, Current.Col);

            }

            return tag;
        }