73 lines
1.9 KiB
C#
73 lines
1.9 KiB
C#
using System;
|
|
|
|
namespace Config.Net.Stores.Formats.Ini
|
|
{
|
|
internal class IniKeyValue : IniEntity
|
|
{
|
|
public const string KeyValueSeparator = "=";
|
|
|
|
public IniKeyValue(string key, string value, string? comment)
|
|
{
|
|
if(key == null) throw new ArgumentNullException(nameof(key));
|
|
Key = key;
|
|
Value = value;
|
|
Comment = comment == null ? null : new IniComment(comment);
|
|
}
|
|
|
|
public string Key { get; }
|
|
|
|
public string Value { get; set; }
|
|
|
|
public string EscapedKey
|
|
{
|
|
get { return Key.Replace("\r", @"\r").Replace("\n", @"\n"); }
|
|
}
|
|
|
|
public string EscapedValue
|
|
{
|
|
get { return Value.Replace("\r", @"\r").Replace("\n", @"\n"); }
|
|
}
|
|
|
|
public IniComment? Comment { get; }
|
|
|
|
public static IniKeyValue? FromLine(string line, bool parseInlineComments, bool unescapeNewLines = false)
|
|
{
|
|
int idx = line.IndexOf(KeyValueSeparator, StringComparison.CurrentCulture);
|
|
if(idx == -1) return null;
|
|
|
|
string key = line.Substring(0, idx).Trim();
|
|
string value = line.Substring(idx + 1).Trim();
|
|
string? comment = null;
|
|
|
|
if (parseInlineComments)
|
|
{
|
|
idx = value.LastIndexOf(IniComment.CommentSeparator, StringComparison.CurrentCulture);
|
|
if (idx != -1)
|
|
{
|
|
comment = value.Substring(idx + 1).Trim();
|
|
value = value.Substring(0, idx).Trim();
|
|
}
|
|
}
|
|
|
|
if(unescapeNewLines)
|
|
{
|
|
key = UnescapeString(key);
|
|
value = UnescapeString(value);
|
|
comment = (comment != null) ? UnescapeString(comment) : null;
|
|
}
|
|
|
|
return new IniKeyValue(key, value, comment);
|
|
}
|
|
|
|
private static string UnescapeString(string key)
|
|
{
|
|
return key.Replace(@"\r", "\r").Replace(@"\n", "\n");
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"{Value}";
|
|
}
|
|
}
|
|
}
|