Example #1
0
        private void ProcessDirective(string blockContent, ParseResult result)
        {
            var match = Regex.Match(blockContent, @"\s*(?<directiveName>\w+)(\s+(?<attribute>\w+)=""(?<value>.*)"")*");

            if (!match.Success)
            {
                return;
            }

            var directiveName = match.Groups["directiveName"].Value;
            var argumentCount = match.Groups["attribute"].Captures.Count;
            var arguments     = new Dictionary <string, string>();

            for (int i = 0; i < argumentCount; i++)
            {
                var name  = match.Groups["attribute"].Captures[i].Value;
                var value = match.Groups["value"].Captures[i].Value;

                arguments.Add(name, value);
            }

            var directiveProcessor = new StandardDirectiveProcessorBase(result);

            directiveProcessor.Initialize(_host);
            if (!directiveProcessor.IsDirectiveSupported(directiveName))
            {
                return;
            }

            directiveProcessor.ProcessDirective(directiveName, arguments);

            result.References.AddRange(directiveProcessor.GetReferencesForProcessingRun());
            result.Imports.AddRange(directiveProcessor.GetImportsForProcessingRun());
            foreach (var includeFile in directiveProcessor.GetIncludeFilesForProcessingRun())
            {
                if (includeFile.Once)
                {
                    if (_includedFiles.Contains(includeFile.File))
                    {
                        continue;
                    }
                    _includedFiles.Add(includeFile.File);
                }
                var includeResult = new Parser(_host).Parse(_host.LoadIncludeFile(includeFile.File));

                // TODO:    handle/validate includeResult.Language and includeResult.Visibility.

                result.ContentBlocks.AddRange(includeResult.ContentBlocks);
                result.FeatureBlocks.AddRange(includeResult.FeatureBlocks);
                result.References.AddRange(includeResult.References);
                result.Imports.AddRange(includeResult.Imports);
            }
        }