public static List<TemplateBlock> CreateTemplateBlocks(this string content, List<StatementExprBlock> statementBlocks)
		{
			var blocks = new List<TemplateBlock>();
			if (content.IsNullOrEmpty()) return blocks;

			int pos;
			var lastPos = 0;
			while ((pos = content.IndexOf('@', lastPos)) != -1)
			{
				var contentBlock = content.Substring(lastPos, pos - lastPos);
				var prevTextBlock = new TextBlock(contentBlock);
				blocks.Add(prevTextBlock);

				pos++; //@

				if (content[pos] == '@')
				{
					prevTextBlock.Content += "@";
					pos++;
				}
				else if (content[pos] == StatementPlaceholderChar)
				{
					pos++; //^
					var index = content.GetNextAlphaNumericExpr(ref pos);
					int statementNo;
					if (int.TryParse(index, out statementNo))
					{
						var statementIndex = statementNo - 1;
						if (statementIndex >= statementBlocks.Count)
							throw new ArgumentOutOfRangeException(
								"Expected < " + statementBlocks.Count + " but was " + statementIndex);

						var statement = statementBlocks[statementIndex];
						blocks.Add(statement);
					}

					//Strip everything but @^1 in <p>@^1</p>\n
					prevTextBlock.RemoveIfEndingWith(UnwantedPrefix);
					content.SkipIfNextIs(ref pos, UnwantedSuffix);
                    content.SkipIfNextIs(ref pos, "\r");
                    content.SkipIfNextIs(ref pos, "\n");
				}
				else
				{
					//ignore email addresses with @ in it
					var charBeforeAtSymbol = content.SafePeekAt(pos - 3);
					if (!charBeforeAtSymbol.IsAlphaNumeric())
					{
						var memberExpr = content.GetNextMemberExpr(ref pos);
						if (memberExpr != null)
						{
							blocks.Add(new MemberExprBlock(memberExpr));
						}
					}
					else
					{
						prevTextBlock.Content += "@";
					}
				}

				lastPos = pos;
			}

			if (lastPos != content.Length)
			{
				var lastBlock = lastPos == 0 ? content : content.Substring(lastPos);
				blocks.Add(new TextBlock(lastBlock));
			}

			return blocks;
		}
        /// <summary>
        /// Creates the template blocks.
        /// </summary>
        /// <param name="content">The content.</param>
        /// <param name="statementBlocks">The statement blocks.</param>
        /// <returns></returns>
        public static List <TemplateBlock> CreateTemplateBlocks(this string content, List <StatementExprBlock> statementBlocks)
        {
            var blocks = new List <TemplateBlock>();

            if (content.IsNullOrEmpty())
            {
                return(blocks);
            }

            int pos;
            var lastPos = 0;

            while ((pos = content.IndexOf('@', lastPos)) != -1)
            {
                var contentBlock  = content.Substring(lastPos, pos - lastPos);
                var prevTextBlock = new TextBlock(contentBlock);
                blocks.Add(prevTextBlock);

                pos++;                 //@

                if (content[pos] == '@')
                {
                    prevTextBlock.Content += "@";
                    pos++;
                }
                else if (content[pos] == StatementPlaceholderChar)
                {
                    pos++;                     //^
                    var index = content.GetNextAlphaNumericExpr(ref pos);
                    int statementNo;
                    if (int.TryParse(index, out statementNo))
                    {
                        var statementIndex = statementNo - 1;
                        if (statementIndex >= statementBlocks.Count)
                        {
                            throw new ArgumentOutOfRangeException(
                                      "Expected < " + statementBlocks.Count + " but was " + statementIndex);
                        }

                        var statement = statementBlocks[statementIndex];
                        blocks.Add(statement);
                    }

                    //Strip everything but @^1 in <p>@^1</p>\n
                    prevTextBlock.RemoveIfEndingWith(UnwantedPrefix);
                    content.SkipIfNextIs(ref pos, UnwantedSuffix);
                    content.SkipIfNextIs(ref pos, "\r");
                    content.SkipIfNextIs(ref pos, "\n");
                }
                else
                {
                    //ignore email addresses with @ in it
                    var charBeforeAtSymbol = content.SafePeekAt(pos - 3);
                    if (!charBeforeAtSymbol.IsAlphaNumeric())
                    {
                        var memberExpr = content.GetNextMemberExpr(ref pos);
                        if (memberExpr != null)
                        {
                            blocks.Add(new MemberExprBlock(memberExpr));
                        }
                    }
                    else
                    {
                        prevTextBlock.Content += "@";
                    }
                }

                lastPos = pos;
            }

            if (lastPos != content.Length)
            {
                var lastBlock = lastPos == 0 ? content : content.Substring(lastPos);
                blocks.Add(new TextBlock(lastBlock));
            }

            return(blocks);
        }