/// <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; } } }
public void Add(ConfigurationValue value) { Values.Add(value); ValuesByKey.Add(value.Key, value); }
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); }