/// <summary> /// Extract value, include extract "Property=Value" formay /// </summary> private static dynamic ExtractValue(string line, BCONConfig config) { if (config.ValueSeperator.Any(line.Contains) || config.PropertySeperator.Any(line.Contains)) { dynamic obj = new ExpandoObject(); string[] parameters = line.Split(config.PropertySeperator, StringSplitOptions.RemoveEmptyEntries); foreach (string p in parameters) { string[] values = p.Split(config.ValueSeperator, StringSplitOptions.RemoveEmptyEntries); if (values.Length > 1) { (obj as IDictionary <string, dynamic>)[values[0].Trim()] = ExtractValue(values[1].Trim(), config); } } return(obj); } double doubleValue; int intValue; if (double.TryParse(line, NumberStyles.Number, null, out doubleValue)) { return(doubleValue); } if (int.TryParse(line, NumberStyles.Number, null, out intValue)) { return(intValue); } return(line); }
/// <summary> /// Parse BCON format configuration stream. /// </summary> public static dynamic ParseBCON(this Stream stream, BCONConfig config = null) { using (var reader = new StreamReader(stream)) { return(ParseBCON(reader.ReadToEnd(), config)); } }
/// <summary> /// Extract property name. /// </summary> private static string ExtractPropertyName(string line, BCONConfig config) { int startIndex = line.IndexOf(config.PropertyStartChar, StringComparison.Ordinal); int endIndex = line.IndexOf(config.PropertyEndChar, StringComparison.Ordinal); if (startIndex < 0 || endIndex < 0 || endIndex <= startIndex) { return(string.Empty); } return(line.Substring(startIndex + 1, endIndex - startIndex - 1).Trim()); }
private static dynamic ParseBCON(IEnumerable <string> stream, BCONConfig config) { dynamic result = new ExpandoObject(); if (config == null) { config = BCONConfig.DefaultConfig; } string currentPropertyName = string.Empty; List <dynamic> values = null; foreach (var line in stream) { if (string.IsNullOrEmpty(line) || line.TrimStart().StartsWith(config.CommentChars)) { continue; } if (line.Trim().Contains(config.PropertyStartChar)) { string propertyName = ExtractPropertyName(line.Trim(), config); if (!string.IsNullOrEmpty(propertyName)) { currentPropertyName = propertyName; values = new List <dynamic>(); } continue; } if (!string.IsNullOrEmpty(currentPropertyName) && values != null) { values.Add(ExtractValue(line.Trim(), config)); (result as IDictionary <string, dynamic>)[currentPropertyName] = values.Count == 1 ? values.First() : values; } } return(result); }
/// <summary> /// Parse BCON format configuration string. /// </summary> public static dynamic ParseBCON(this string text, BCONConfig config = null) { return(ParseBCON(text.Split(new[] { '\r', '\n' }), config)); }