コード例 #1
0
        /// <summary>
        /// Add or update the value for the given section/key pair
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void Set(string section, string key, string?value)
        {
            IsChanged = true;
            ConfigurationSection?configurationSection;
            ConfigurationValue?  configurationValue;

            if (!sectionsByName.TryGetValue(section, out configurationSection))
            {
                configurationSection       = new ConfigurationSection("", "", section, "", "");
                configurationSection.Index = lines.Count;
                sectionsByName.Add(section, configurationSection);
                lines.Add(configurationSection);
            }
            if (configurationSection.ValuesByKey.TryGetValue(key, out configurationValue))
            {
                configurationValue.Value = value;
            }
            else
            {
                var  indentation                 = configurationSection.Indentation;
                var  keyTrailingWhitespace       = "";
                var  delimiterTrailingWhitespace = "";
                char delimiter = '=';
                var  index     = configurationSection.Index + 1;
                if (configurationSection.Values.Count > 0)
                {
                    var previousValue = configurationSection.Values[configurationSection.Values.Count - 1];
                    indentation                 = previousValue.Indentation;
                    keyTrailingWhitespace       = previousValue.KeyTrailingWhitespace;
                    delimiter                   = previousValue.Delimiter;
                    delimiterTrailingWhitespace = previousValue.DelimiterTrailingWhitespace;
                    index = previousValue.Index + 1;
                }
                configurationValue       = new ConfigurationValue(indentation, key, keyTrailingWhitespace, delimiter, delimiterTrailingWhitespace, value, "");
                configurationValue.Index = index;
                configurationSection.Add(configurationValue);
                lines.Insert(index, configurationValue);
                for (var i = index + 1; i < lines.Count; ++i)
                {
                    ++lines[i].Index;
                }
            }
        }
コード例 #2
0
 public void Add(ConfigurationValue value)
 {
     Values.Add(value);
     ValuesByKey.Add(value.Key, value);
 }
コード例 #3
0
        public static bool TryPrase(string iniLine, ConfigurationLine?previousLine, out ConfigurationLine line)
        {
            var indentation = "";
            var i           = 0;

            while (i < iniLine.Length && IsWhitespace(iniLine[i]))
            {
                indentation += iniLine[i];
                ++i;
            }

            // Empty or whitespace-only
            if (i == iniLine.Length)
            {
                line = new ConfigurationLine(indentation);
                return(true);
            }

            // Comment
            if (iniLine[i] == '#' || iniLine[i] == ';')
            {
                var delimiter = iniLine[i];
                ++i;
                var leadingWhitespace = "";
                while (i < iniLine.Length && IsWhitespace(iniLine[i]))
                {
                    leadingWhitespace += iniLine[i];
                    ++i;
                }
                var text = iniLine.Substring(i);
                line = new ConfigurationComment(indentation, delimiter, leadingWhitespace, text);
                return(true);
            }

            // Section
            if (iniLine[i] == '[')
            {
                var name = "";
                ++i;
                while (i < iniLine.Length && iniLine[i] != ']')
                {
                    name += iniLine[i];
                    ++i;
                }
                if (iniLine[i] == ']')
                {
                    ++i;
                    var trailingWhitespace = "";
                    while (i < iniLine.Length && IsWhitespace(iniLine[i]))
                    {
                        trailingWhitespace += iniLine[i];
                        ++i;
                    }
                    if (i == iniLine.Length)
                    {
                        var trimmedName           = name.TrimStart();
                        var nameLeadingWhitespace = name.Substring(0, name.Length - trimmedName.Length);
                        trimmedName = trimmedName.TrimEnd();
                        var nameTrailingWhitespace = name.Substring(nameLeadingWhitespace.Length + trimmedName.Length);
                        line = new ConfigurationSection(indentation, nameLeadingWhitespace, trimmedName, nameTrailingWhitespace, trailingWhitespace);
                        return(true);
                    }
                }
                line = null !;
                return(false);
            }

            // Value
            var    key = "";
            var    keyTrailingWhitespace       = "";
            char   keyValueDelimiter           = '=';
            var    delimiterTrailingWhitespace = "";
            string?value = null;
            var    valueTrailingWhitespace = "";

            while (i < iniLine.Length && iniLine[i] != ':' && iniLine[i] != '=')
            {
                key += iniLine[i];
                ++i;
            }
            var j = key.Length - 1;

            while (j >= 0 && IsWhitespace(key[j]))
            {
                keyTrailingWhitespace = key[j] + keyTrailingWhitespace;
                --j;
            }
            key = key.Substring(0, j + 1);

            if (i < iniLine.Length && (iniLine[i] == ':' || iniLine[i] == '='))
            {
                if (key.Length == 0)
                {
                    // Expecting key before = or :
                    line = null !;
                    return(false);
                }
                keyValueDelimiter = iniLine[i];
                ++i;
                while (i < iniLine.Length && IsWhitespace(iniLine[i]))
                {
                    delimiterTrailingWhitespace += iniLine[i];
                    ++i;
                }
                value = iniLine.Substring(i);
                j     = value.Length - 1;
                while (j >= 0 && IsWhitespace(value[j]))
                {
                    valueTrailingWhitespace = value[j] + valueTrailingWhitespace;
                    --j;
                }
                value = value.Substring(0, j + 1);
            }
            else
            {
                // Blank line
                if (key.Length == 0)
                {
                    line = new ConfigurationLine(indentation);
                    return(true);
                }
            }

            // Check for wrapped lines and unwrap into the previous line's value
            if (previousLine is ConfigurationValue previousValueLine)
            {
                if (indentation.Length > previousValueLine.Indentation.Length)
                {
                    previousValueLine.Value += " " + key;
                    previousValueLine.ValueTrailingWhitespace = valueTrailingWhitespace;
                    line = previousValueLine;
                    return(true);
                }
            }

            line = new ConfigurationValue(indentation, key, keyTrailingWhitespace, keyValueDelimiter, delimiterTrailingWhitespace, value, valueTrailingWhitespace);
            return(true);
        }