static bool ComplainExcessAttributes(Directive dt, ParsedTemplate pt)
        {
            if (dt.Attributes.Count == 0)
            {
                return(false);
            }
            StringBuilder sb    = new StringBuilder("Unknown attributes ");
            bool          first = true;

            foreach (string key in dt.Attributes.Keys)
            {
                if (!first)
                {
                    sb.Append(", ");
                }
                else
                {
                    first = false;
                }
                sb.Append(key);
            }
            sb.Append(" found in ");
            sb.Append(dt.Name);
            sb.Append(" directive.");
            pt.LogWarning(sb.ToString(), dt.StartLocation);
            return(false);
        }
        public static TemplateSettings GetSettings(ITextTemplatingEngineHost host, ParsedTemplate pt)
        {
            string language = null;

            TemplateSettings settings = new TemplateSettings();

            foreach (Directive dt in pt.Directives)
            {
                switch (dt.Name)
                {
                case "template":
                    string val = dt.Extract("language");
                    if (val != null)
                    {
                        language = val;
                    }
                    val = dt.Extract("debug");
                    if (val != null)
                    {
                        settings.Debug = string.Compare(val, "true", StringComparison.OrdinalIgnoreCase) == 0;
                    }
                    val = dt.Extract("inherits");
                    if (val != null)
                    {
                        settings.Inherits = val;
                    }
                    val = dt.Extract("culture");
                    if (val != null)
                    {
                        System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo(val);
                        if (culture == null)
                        {
                            pt.LogWarning("Could not find culture '" + val + "'", dt.StartLocation);
                        }
                        else
                        {
                            settings.Culture = culture;
                        }
                    }
                    val = dt.Extract("hostspecific");
                    if (val != null)
                    {
                        settings.HostSpecific = string.Compare(val, "true", StringComparison.OrdinalIgnoreCase) == 0;
                    }
                    break;

                case "assembly":
                    string name = dt.Extract("name");
                    if (name == null)
                    {
                        pt.LogError("Missing name attribute in assembly directive", dt.StartLocation);
                    }
                    else
                    {
                        settings.Assemblies.Add(name);
                    }
                    break;

                case "import":
                    string namespac = dt.Extract("namespace");
                    if (namespac == null)
                    {
                        pt.LogError("Missing namespace attribute in import directive", dt.StartLocation);
                    }
                    else
                    {
                        settings.Imports.Add(namespac);
                    }
                    break;

                case "output":
                    settings.Extension = dt.Extract("extension");
                    string encoding = dt.Extract("encoding");
                    if (encoding != null)
                    {
                        settings.Encoding = Encoding.GetEncoding("encoding");
                    }
                    break;

                case "include":
                    throw new InvalidOperationException("Include is handled in the parser");

                default:
                    throw new NotImplementedException("Custom directives are not supported yet");
                }
                ComplainExcessAttributes(dt, pt);
            }

            if (settings.Name == null)
            {
                settings.Name = string.Format("GeneratedTextTransformation{0:x}", new System.Random().Next());
            }
            if (settings.Namespace == null)
            {
                settings.Namespace = typeof(TextTransformation).Namespace;
            }

            //resolve the CodeDOM provider
            if (String.IsNullOrEmpty(language))
            {
                pt.LogError("No language was specified for the template");
                return(settings);
            }

            if (language == "C#v3.5")
            {
                Dictionary <string, string> providerOptions = new Dictionary <string, string> ();
                providerOptions.Add("CompilerVersion", "v3.5");
                settings.Provider = new CSharpCodeProvider(providerOptions);
            }
            else
            {
                settings.Provider = CodeDomProvider.CreateProvider(language);
            }

            if (settings.Provider == null)
            {
                pt.LogError("A provider could not be found for the language '" + language + "'");
                return(settings);
            }

            return(settings);
        }