using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Apewer.Models
{
/// INI 文件。
[Serializable]
public sealed class IniFile : IEnumerable, IToJson
{
List _sections = new List();
#region Constructors
///
public IniFile() { }
///
public IniFile(IEnumerable sections)
{
if (sections == null) throw new ArgumentNullException(nameof(sections));
sections.ForEach(Add);
}
#endregion
#region CRUD
/// 节的数量。
public int Count { get => _sections.Count; }
/// 添加节。
public void Add(IniSection section)
{
if (section == null) return;
_sections.Add(section);
}
/// 添加节。
public void Add(string name, TextField[] fields) => _sections.Add(new IniSection(name, fields));
/// 获取节。
public IniSection Get(string sectionName)
{
var emptyName = sectionName.IsEmpty();
foreach (var section in _sections)
{
if (emptyName)
{
if (section.Name.IsEmpty()) return section;
}
else
{
if (section.Name == sectionName) return section;
}
}
return null;
}
/// 移除节。
public void Remove(IniSection section)
{
while (_sections.Contains(section)) _sections.Remove(section);
}
/// 移除节。
public void Remove(string sectionName)
{
var emptyName = sectionName.IsEmpty();
foreach (var section in _sections)
{
if (emptyName)
{
_sections = _sections.FindAll(x => x.Name.IsEmpty());
}
else
{
_sections = _sections.FindAll(x => x.Name == sectionName);
}
}
}
#endregion
#region IEnumerable
///
public IEnumerator GetEnumerator() => new Enumerator(i => i < _sections.Count ? new Class(_sections[i]) : null);
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
#endregion
#region IToJson
///
public Json ToJson()
{
var json = Json.NewArray();
_sections.ForEach(section => json.AddItem(section.ToJson()));
return json;
}
#endregion
#region ToString
const string CRLF = "\r\n";
///
public override string ToString() => ToString(CRLF);
///
public string ToString(string seperator)
{
if (seperator.IsEmpty()) seperator = CRLF;
var sb = new StringBuilder();
var noName = 0;
foreach (var section in _sections)
{
if (section == null) continue;
if (section.Name.IsEmpty())
{
var count = section.Count;
for (var i = 0; i < count; i++)
{
var field = section.GetField(i);
if (Append(sb, field))
{
sb.Append(seperator);
noName += 1;
}
}
}
}
if (noName > 1) sb.Append(seperator);
foreach (var section in _sections)
{
if (section == null) continue;
if (section.Name.NotEmpty())
{
sb.Append("[");
sb.Append(section.Name);
sb.Append("]");
sb.Append(seperator);
foreach (var field in section)
{
if (Append(sb, field))
{
sb.Append(seperator);
}
}
}
sb.Append(seperator);
}
return sb.ToString();
}
static bool Append(StringBuilder sb, TextField field)
{
var nameEmpty = field.Name.IsEmpty();
var valueEmpty = field.Value.IsEmpty();
if (nameEmpty && valueEmpty) return false;
if (!nameEmpty)
{
sb.Append(field.Name);
sb.Append(" =");
}
if (!valueEmpty)
{
if (nameEmpty) sb.Append("; ");
else sb.Append(" ");
sb.Append(field.Value);
}
return true;
}
#endregion
}
}