예제 #1
0
        /// <summary>
        /// Construct an instance.
        /// </summary>
        /// <param name="parent">The template item that contains this item.</param>
        /// <param name="name">The name of this item.</param>
        /// <param name="lineNumber">This item's line number position within the xml template file.</param>
        /// <param name="positionInLine">This item's column position within the xml template file.</param>
        protected internal TemplateItem(TemplateItem parent, string name, int lineNumber, int positionInLine)
        {
            this.name           = name;
            this.lineNumber     = lineNumber;
            this.positionInLine = positionInLine;
            this.parent         = parent;
            if (this.parent != null)
            {
                this.parent.children.Add(this);
            }

            if (name.IndexOf(".") != -1)
            {
                string [] parts = name.Split('.');
                if (parts.Length > 2)
                {
                    string mess =
                        string.Format(
                            Messages.TemplateItem_TemplateItem_VariableNameIsNotLegal,
                            name);
                    logger.Error(string.Format(Messages.ErrorAtLineAndColumn, mess, this.lineNumber, this.positionInLine));
                    throw new TemplateExpansionException(this.lineNumber, this.positionInLine, mess);
                }

                if (parts.Length == 2)
                {
                    TemplateItem currentParent = this;
                    while (parentTableItem == null && currentParent.Parent != null)
                    {
                        currentParent = currentParent.Parent;
                        if (currentParent is TableTemplateItem)
                        {
                            if (((TableTemplateItem)currentParent).IsTableOwner(parts[0]))
                            {
                                parentTableItem = (TableTemplateItem)currentParent;
                            }
                        }
                    }

                    this.name = parts[1];
                }
            }
        }
예제 #2
0
		/// <summary>
		/// Construct an instance.
		/// </summary>
		/// <param name="parent">The template item that contains this item.</param>
		/// <param name="name">The name of this item.</param>
		/// <param name="lineNumber">This item's line number position within the xml template file.</param>
		/// <param name="positionInLine">This item's column position within the xml template file.</param>
		protected internal TemplateItem(TemplateItem parent, string name, int lineNumber, int positionInLine)
		{
			this.name = name;
			this.lineNumber = lineNumber;
			this.positionInLine = positionInLine;
			this.parent = parent;
			if (this.parent != null)
			{
				this.parent.children.Add(this);
			}

			if (name.IndexOf(".") != -1)
			{
				string [] parts = name.Split('.');
				if (parts.Length > 2) {
				    string mess =
				        string.Format(
				            Messages.TemplateItem_TemplateItem_VariableNameIsNotLegal,
				            name);
                    logger.Error(string.Format(Messages.ErrorAtLineAndColumn, mess, this.lineNumber, this.positionInLine));
                    throw new TemplateExpansionException(this.lineNumber, this.positionInLine, mess);
				}

				if (parts.Length == 2)
				{
					TemplateItem currentParent = this;
					while (parentTableItem == null && currentParent.Parent != null)
					{
						currentParent = currentParent.Parent;
						if (currentParent is TableTemplateItem)
						{
							if (((TableTemplateItem)currentParent).IsTableOwner(parts[0]))
							{
								parentTableItem = (TableTemplateItem)currentParent;
							}
						}
					}

					this.name = parts[1];
				}
			}
		}
예제 #3
0
        private void Load(Stream stream, Dictionary<string, Delegate> additionalCustomFormulas = null)
        {
            var templateEngineSettings = FluentJdfLibrary.Settings.TemplateEngineSettings;
            TemplateItem parent = null;

            var formulaTemplateItemFactory = new FormulaTemplateItemFactory(additionalCustomFormulas);

            items = new TemplateItemCollection();
            StreamReader reader = null;

            try
            {
                reader = new StreamReader(stream);
            }
            catch (Exception err)
            {
                string mess = string.Format(Messages.CouldNotOpen, name);
                logger.Error(mess, err);
                throw new TemplateApiException(mess, err);
            }

            StringBuilder staticText = new StringBuilder(100);

            int lineNumber = 1;
            int positionInLine = -1;

            try
            {
                States currentState = States.Text;

                StringBuilder varName = new StringBuilder(50);
                StringBuilder defaultValue = new StringBuilder(50);
                StringBuilder tableName = new StringBuilder(50);
                StringBuilder tableTag = new StringBuilder(50);
                char c = ' ';

                while (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                {
                    switch (currentState)
                    {
                        case States.Text:
                            switch (c)
                            {
                                case '[':
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c == ':')
                                        {
                                            currentState = States.Var;
                                            if (staticText.Length > 0)
                                            {
                                                StaticTemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                                                if (parent == null)
                                                {
                                                    items.Add(item);
                                                }
                                            }
                                            staticText.Remove(0, staticText.Length);
                                            varName.Remove(0, varName.Length);
                                            defaultValue.Remove(0, defaultValue.Length);
                                            tableName.Remove(0, tableName.Length);
                                            tableTag.Remove(0, tableName.Length);
                                        }
                                        else if (c == '%')
                                        {
                                            currentState = States.TableTag;
                                            if (staticText.Length > 0)
                                            {
                                                StaticTemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                                                if (parent == null)
                                                {
                                                    items.Add(item);
                                                }
                                            }
                                            staticText.Remove(0, staticText.Length);
                                            varName.Remove(0, varName.Length);
                                            defaultValue.Remove(0, defaultValue.Length);
                                            tableName.Remove(0, tableName.Length);
                                            tableTag.Remove(0, tableTag.Length);
                                        }
                                        else
                                        {
                                            staticText.Append("[");
                                        }
                                    }
                                    break;
                                case '<':
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c == '!')
                                        {
                                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                            {
                                                if (c == '-')
                                                {
                                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                                    {
                                                        if (c == '-')
                                                        {
                                                            currentState = States.Comment;
                                                        }
                                                        else
                                                        {
                                                            staticText.Append("<!-");
                                                        }
                                                    }
                                                    else
                                                    {
                                                        staticText.Append("<!-");
                                                    }
                                                }
                                                else
                                                {
                                                    staticText.Append("<!");
                                                }
                                            }
                                            else
                                            {
                                                staticText.Append("<!");
                                            }
                                        }
                                        else
                                        {
                                            staticText.Append("<");
                                        }
                                    }
                                    else
                                    {
                                        staticText.Append("<");
                                    }
                                    break;
                            }
                            if (currentState == States.Text)
                            {
                                staticText.Append(c);
                            }
                            break;
                        case States.Comment:
                            if (c == '-')
                            {
                                if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                {
                                    if (c == '-')
                                    {
                                        if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                        {
                                            if (c == '>')
                                            {
                                                currentState = States.Text;
                                            }
                                        }
                                        else
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF.  An XML comment must end with '-->'.");
                                        }
                                    }
                                }
                                else
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF.  An XML comment must end with '-->'.");
                                }
                            }
                            break;
                        case States.TableTag:
                            //if the character is non-blank or one non-blank was encountered in this tag
                            if (c == '%')
                            {
                                if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                {
                                    if (c != ']')
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                    }
                                }
                                else
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                }
                                if (tableTag.ToString() == "end table")
                                {
                                    if (parent == null)
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "[%end table%] without corresponding [%table(<tablename>)%]");
                                    }
                                    //tables can be nested, this "pops" the stack of parents
                                    parent = parent.Parent;
                                    currentState = States.Text;
                                    break;
                                }
                                else if (tableTag.ToString() == "table")
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "table requires table name parameter");
                                }
                                else
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "unknown [% tag " + tableTag.ToString());
                                }

                            }
                            else if (c == '(')
                            {
                                if (tableTag.ToString() == "table")
                                {
                                    currentState = States.TableName;
                                    break;
                                }
                                else
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "'(' not expected");
                                }
                            }
                            tableTag.Append(c);
                            break;
                        case States.TableName:
                            if (c == ')')
                            {
                                if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                {
                                    if (c != '%')
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "'%' expected");
                                    }
                                    else
                                    {
                                        if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                        {
                                            if (c != ']')
                                            {
                                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                            }
                                        }
                                        else
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                        }
                                        if (tableName.Length > 0)
                                        {
                                            string tName = tableName.ToString();
                                            TemplateItem newParent = new TableTemplateItem(parent, tName, lineNumber, positionInLine, tName);
                                            if (parent == null)
                                            {
                                                items.Add(newParent);
                                            }
                                            parent = newParent;
                                            currentState = States.Text;
                                        }
                                        else
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "[%table(<table name>%} must have table name specified.");
                                        }
                                    }
                                }
                                else
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                }
                            }
                            tableName.Append(c);
                            break;
                        case States.Var:
                            switch (c)
                            {
                                case ':':
                                    if (varName.Length == 0)
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Variable name is zero length");
                                    }
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c != ']')
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                        }
                                    }
                                    else
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                    }
                                    VariableTemplateItem item = new VariableTemplateItem(parent, varName.ToString(), lineNumber, positionInLine, null);
                                    if (parent == null)
                                    {
                                        items.Add(item);
                                    }
                                    currentState = States.Text;
                                    break;
                                case '=':
                                    if (varName.Length == 0)
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Variable name is zero length");
                                    }
                                    currentState = States.Val;
                                    break;
                                default:
                                    varName.Append(c);
                                    break;
                            }
                            break;
                        case States.Val:
                            switch (c)
                            {
                                case ':':
                                    if (defaultValue.Length == 0)
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Default value is zero length");
                                    }
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c != ']')
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                        }
                                    }
                                    else
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                    }
                                    string def = defaultValue.ToString().Trim();
                                    if (def.IndexOf("(") > -1 && def.EndsWith(")")) {
                                        FormulaTemplateItem item = formulaTemplateItemFactory.CreateFormulaItem(parent, varName.ToString(), lineNumber, positionInLine, def, templateEngineSettings);
                                        if (parent == null)
                                        {
                                            items.Add(item);
                                        }
                                    }
                                    else
                                    {
                                        VariableTemplateItem item = new VariableTemplateItem(parent, varName.ToString(), lineNumber, positionInLine, def);
                                        if (parent == null)
                                        {
                                            items.Add(item);
                                        }
                                    }
                                    currentState = States.Text;
                                    break;
                                default:
                                    defaultValue.Append(c);
                                    break;
                            }
                            break;
                    }
                }
            }
            finally
            {
                reader.Close();
                if (staticText.Length > 0)
                {
                    TemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                    if (parent == null)
                    {
                        items.Add(item);
                    }
                }

                if (parent != null)
                {
                    LogAndThrowTemplateApiException("One or more [%table tags is not closed with an [%end table");
                }
            }
        }
예제 #4
0
        private void Load(Stream stream, Dictionary <string, Delegate> additionalCustomFormulas = null)
        {
            var          templateEngineSettings = FluentJdfLibrary.Settings.TemplateEngineSettings;
            TemplateItem parent = null;

            var formulaTemplateItemFactory = new FormulaTemplateItemFactory(additionalCustomFormulas);

            items = new TemplateItemCollection();
            StreamReader reader = null;

            try
            {
                reader = new StreamReader(stream);
            }
            catch (Exception err)
            {
                string mess = string.Format(Messages.CouldNotOpen, name);
                logger.Error(mess, err);
                throw new TemplateApiException(mess, err);
            }

            StringBuilder staticText = new StringBuilder(100);

            int lineNumber     = 1;
            int positionInLine = -1;

            try
            {
                States currentState = States.Text;

                StringBuilder varName      = new StringBuilder(50);
                StringBuilder defaultValue = new StringBuilder(50);
                StringBuilder tableName    = new StringBuilder(50);
                StringBuilder tableTag     = new StringBuilder(50);
                char          c            = ' ';

                while (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                {
                    switch (currentState)
                    {
                    case States.Text:
                        switch (c)
                        {
                        case '[':
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c == ':')
                                {
                                    currentState = States.Var;
                                    if (staticText.Length > 0)
                                    {
                                        StaticTemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                                        if (parent == null)
                                        {
                                            items.Add(item);
                                        }
                                    }
                                    staticText.Remove(0, staticText.Length);
                                    varName.Remove(0, varName.Length);
                                    defaultValue.Remove(0, defaultValue.Length);
                                    tableName.Remove(0, tableName.Length);
                                    tableTag.Remove(0, tableName.Length);
                                }
                                else if (c == '%')
                                {
                                    currentState = States.TableTag;
                                    if (staticText.Length > 0)
                                    {
                                        StaticTemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                                        if (parent == null)
                                        {
                                            items.Add(item);
                                        }
                                    }
                                    staticText.Remove(0, staticText.Length);
                                    varName.Remove(0, varName.Length);
                                    defaultValue.Remove(0, defaultValue.Length);
                                    tableName.Remove(0, tableName.Length);
                                    tableTag.Remove(0, tableTag.Length);
                                }
                                else
                                {
                                    staticText.Append("[");
                                }
                            }
                            break;

                        case '<':
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c == '!')
                                {
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c == '-')
                                        {
                                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                            {
                                                if (c == '-')
                                                {
                                                    currentState = States.Comment;
                                                }
                                                else
                                                {
                                                    staticText.Append("<!-");
                                                }
                                            }
                                            else
                                            {
                                                staticText.Append("<!-");
                                            }
                                        }
                                        else
                                        {
                                            staticText.Append("<!");
                                        }
                                    }
                                    else
                                    {
                                        staticText.Append("<!");
                                    }
                                }
                                else
                                {
                                    staticText.Append("<");
                                }
                            }
                            else
                            {
                                staticText.Append("<");
                            }
                            break;
                        }
                        if (currentState == States.Text)
                        {
                            staticText.Append(c);
                        }
                        break;

                    case States.Comment:
                        if (c == '-')
                        {
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c == '-')
                                {
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c == '>')
                                        {
                                            currentState = States.Text;
                                        }
                                    }
                                    else
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF.  An XML comment must end with '-->'.");
                                    }
                                }
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF.  An XML comment must end with '-->'.");
                            }
                        }
                        break;

                    case States.TableTag:
                        //if the character is non-blank or one non-blank was encountered in this tag
                        if (c == '%')
                        {
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c != ']')
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                }
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                            }
                            if (tableTag.ToString() == "end table")
                            {
                                if (parent == null)
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "[%end table%] without corresponding [%table(<tablename>)%]");
                                }
                                //tables can be nested, this "pops" the stack of parents
                                parent       = parent.Parent;
                                currentState = States.Text;
                                break;
                            }
                            else if (tableTag.ToString() == "table")
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "table requires table name parameter");
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "unknown [% tag " + tableTag.ToString());
                            }
                        }
                        else if (c == '(')
                        {
                            if (tableTag.ToString() == "table")
                            {
                                currentState = States.TableName;
                                break;
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "'(' not expected");
                            }
                        }
                        tableTag.Append(c);
                        break;

                    case States.TableName:
                        if (c == ')')
                        {
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c != '%')
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "'%' expected");
                                }
                                else
                                {
                                    if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                                    {
                                        if (c != ']')
                                        {
                                            LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                        }
                                    }
                                    else
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                                    }
                                    if (tableName.Length > 0)
                                    {
                                        string       tName     = tableName.ToString();
                                        TemplateItem newParent = new TableTemplateItem(parent, tName, lineNumber, positionInLine, tName);
                                        if (parent == null)
                                        {
                                            items.Add(newParent);
                                        }
                                        parent       = newParent;
                                        currentState = States.Text;
                                    }
                                    else
                                    {
                                        LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "[%table(<table name>%} must have table name specified.");
                                    }
                                }
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                            }
                        }
                        tableName.Append(c);
                        break;

                    case States.Var:
                        switch (c)
                        {
                        case ':':
                            if (varName.Length == 0)
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Variable name is zero length");
                            }
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c != ']')
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                }
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                            }
                            VariableTemplateItem item = new VariableTemplateItem(parent, varName.ToString(), lineNumber, positionInLine, null);
                            if (parent == null)
                            {
                                items.Add(item);
                            }
                            currentState = States.Text;
                            break;

                        case '=':
                            if (varName.Length == 0)
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Variable name is zero length");
                            }
                            currentState = States.Val;
                            break;

                        default:
                            varName.Append(c);
                            break;
                        }
                        break;

                    case States.Val:
                        switch (c)
                        {
                        case ':':
                            if (defaultValue.Length == 0)
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Default value is zero length");
                            }
                            if (ReadNext(reader, staticText, ref lineNumber, ref positionInLine, ref c))
                            {
                                if (c != ']')
                                {
                                    LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "']' expected");
                                }
                            }
                            else
                            {
                                LogAndThrowTemplateExpansionException(lineNumber, positionInLine, "Unexpected EOF");
                            }
                            string def = defaultValue.ToString().Trim();
                            if (def.IndexOf("(") > -1 && def.EndsWith(")"))
                            {
                                FormulaTemplateItem item = formulaTemplateItemFactory.CreateFormulaItem(parent, varName.ToString(), lineNumber, positionInLine, def, templateEngineSettings);
                                if (parent == null)
                                {
                                    items.Add(item);
                                }
                            }
                            else
                            {
                                VariableTemplateItem item = new VariableTemplateItem(parent, varName.ToString(), lineNumber, positionInLine, def);
                                if (parent == null)
                                {
                                    items.Add(item);
                                }
                            }
                            currentState = States.Text;
                            break;

                        default:
                            defaultValue.Append(c);
                            break;
                        }
                        break;
                    }
                }
            }
            finally
            {
                reader.Close();
                if (staticText.Length > 0)
                {
                    TemplateItem item = new StaticTemplateItem(parent, "static", lineNumber, positionInLine, staticText.ToString());
                    if (parent == null)
                    {
                        items.Add(item);
                    }
                }

                if (parent != null)
                {
                    LogAndThrowTemplateApiException("One or more [%table tags is not closed with an [%end table");
                }
            }
        }