コード例 #1
0
        public BlockResult ProcessBlock(string text, VariableCollection valueCollection)
        {
            var result = new BlockResult();

            if (string.IsNullOrEmpty(text))
            {
                return(result);
            }

            if (RemoveComments)
            {
                text = RemoveTextComments(text);
            }

            var read_pos = 0;

            while (read_pos < text.Length)
            {
                if (!FindAnyTag(text, "{{", "}}", read_pos, out var tagStart, out var tagEnd, out var tag))
                {
                    break;
                }

                result.Builder.Append(text, read_pos, tagStart - read_pos);
                read_pos = tagEnd;

                if (tag.StartsWith("#"))
                {
                    if (tag.StartsWith("#if ", StringComparison.OrdinalIgnoreCase))
                    {
                        conditionalBlock.Process(text, tag, valueCollection, result, ref read_pos);
                    }

                    else if (tag.StartsWith("#master ", StringComparison.OrdinalIgnoreCase))
                    {
                        ProcessMasterTag(tag, result);
                    }

                    else if (tag.StartsWith("#url ", StringComparison.OrdinalIgnoreCase))
                    {
                        ProcessUrlTag(tag, result);
                    }

                    else if (string.Equals(tag, "#script", StringComparison.OrdinalIgnoreCase))
                    {
                        ProcessScriptBlock(text, valueCollection, result, ref read_pos);
                    }

                    else if (string.Equals(tag, "#style", StringComparison.OrdinalIgnoreCase))
                    {
                        ProcessStyleBlock(text, valueCollection, result, ref read_pos);
                    }

                    else if (tag.StartsWith("#each ", StringComparison.OrdinalIgnoreCase))
                    {
                        eachBlock.Process(text, tag, valueCollection, result, ref read_pos);
                    }

                    else
                    {
                        result.Builder.Append(text.Substring(tagStart, tagEnd - tagStart));
                    }
                }
                else
                {
                    // Process Variable Tag
                    if (valueCollection != null && valueCollection.TryGetFormattedValue(tag, out var item_value))
                    {
                        result.Builder.Append(item_value);
                        continue;
                    }

                    var sourceText = text.Substring(tagStart, tagEnd - tagStart);
                    var varResult  = OnVariableNotFound(tag, sourceText);

                    if (!string.IsNullOrEmpty(varResult))
                    {
                        result.Builder.Append(varResult);
                    }
                }
            }

            if (read_pos < text.Length)
            {
                result.Builder.Append(text, read_pos, text.Length - read_pos);
            }

            return(result);
        }