diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs new file mode 100644 index 00000000..7b8be011 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.IO; + +namespace UniversalEditor.DataFormats.PropertyList.ExtensibleConfiguration +{ + public class ExtensibleConfigurationDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Extensible Configuration document", new string[] { "*.inix", "*.xni" }); + dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private int mvarIndentLength = 4; + public int IndentLength { get { return this.mvarIndentLength; } set { this.mvarIndentLength = value; } } + + private ExtensibleConfigurationSettings mvarSettings = new ExtensibleConfigurationSettings(); + protected ExtensibleConfigurationSettings Settings { get { return mvarSettings; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PropertyListObjectModel plom = objectModel as PropertyListObjectModel; + Reader tr = base.Accessor.Reader; + string nextString = string.Empty; + string nextPropertyName = string.Empty; + bool insideQuotedString = false; + bool escaping = false; + Group nextGroup = null; + while (!tr.EndOfStream) + { + if (nextString.StartsWith(mvarSettings.SingleLineCommentStart)) + { + string comment = tr.ReadLine(); + } + if (nextString.StartsWith(mvarSettings.MultiLineCommentStart)) + { + string comment = tr.ReadUntil(mvarSettings.MultiLineCommentEnd); + string cmntend = tr.ReadFixedLengthString(mvarSettings.MultiLineCommentEnd.Length); + nextString = String.Empty; + continue; + } + + char nextChar = tr.ReadChar(); + if (insideQuotedString) + { + if (nextChar == '"') + { + if (!escaping) + { + insideQuotedString = false; + continue; + } + } + else + { + if (nextChar == '\\') + { + if (!escaping) + { + escaping = true; + continue; + } + } + } + nextString += nextChar; + escaping = false; + } + else + { + char c = nextChar; + string cw = c.ToString(); + if (c == '"') + { + insideQuotedString = !insideQuotedString; + continue; + } + else if (cw == mvarSettings.PropertyNameValueSeparator) + { + nextPropertyName = nextString; + nextString = string.Empty; + } + else if (cw == mvarSettings.PropertySeparator) + { + if (nextPropertyName != null) + { + nextPropertyName = nextPropertyName.Trim(); + nextString = nextString.Trim(); + + if (nextGroup != null) + { + nextGroup.Properties.Add(nextPropertyName, nextString); + } + else + { + plom.Properties.Add(nextPropertyName, nextString); + } + } + nextPropertyName = string.Empty; + nextString = string.Empty; + } + else if (cw == mvarSettings.GroupStart) + { + Group group = new Group(); + group.Name = nextString.Trim(); + nextString = string.Empty; + if (nextGroup != null) + { + nextGroup.Groups.Add(group); + } + else + { + plom.Groups.Add(group); + } + nextGroup = group; + } + else if (cw == mvarSettings.GroupEnd) + { + if (nextGroup != null) + { + nextGroup = nextGroup.Parent; + } + } + else + { + nextString += nextChar; + continue; + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PropertyListObjectModel plom = objectModel as PropertyListObjectModel; + Writer tw = base.Accessor.Writer; + foreach (Property p in plom.Properties) + { + tw.Write(mvarSettings.PropertyNamePrefix); + tw.Write(p.Name); + tw.Write(mvarSettings.PropertyNameSuffix); + tw.Write(mvarSettings.PropertyNameValueSeparator); + tw.Write(mvarSettings.PropertyValuePrefix); + tw.WriteFixedLengthString(p.Value.ToString()); + tw.Write(mvarSettings.PropertyValueSuffix); + } + foreach (Group g in plom.Groups) + { + this.WriteGroup(tw, g, 0); + } + tw.Flush(); + tw.Close(); + } + private void WriteGroup(Writer tw, Group group, int indent) + { + string indents = new string(' ', indent * this.mvarIndentLength); + tw.WriteLine(indents + group.Name); + tw.WriteLine(indents + "{"); + foreach (Property p in group.Properties) + { + tw.WriteLine(string.Concat(new object[] + { + indents, + new string(' ', this.mvarIndentLength), + p.Name, + "=\"", + p.Value, + "\";" + })); + } + foreach (Group g in group.Groups) + { + this.WriteGroup(tw, g, indent + 1); + } + tw.WriteLine(indents + "}"); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs new file mode 100644 index 00000000..9a031c9b --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.PropertyList.ExtensibleConfiguration +{ + public class ExtensibleConfigurationSettings + { + private string mvarPropertyNamePrefix = String.Empty; + public string PropertyNamePrefix { get { return mvarPropertyNamePrefix; } set { mvarPropertyNamePrefix = value; } } + + private string mvarPropertyNameSuffix = String.Empty; + public string PropertyNameSuffix { get { return mvarPropertyNameSuffix; } set { mvarPropertyNameSuffix = value; } } + + private string mvarPropertyNameValueSeparator = "="; + public string PropertyNameValueSeparator { get { return mvarPropertyNameValueSeparator; } set { mvarPropertyNameValueSeparator = value; } } + + private string mvarPropertyValuePrefix = "\""; + public string PropertyValuePrefix { get { return mvarPropertyValuePrefix; } set { mvarPropertyValuePrefix = value; } } + + private string mvarPropertyValueSuffix = "\""; + public string PropertyValueSuffix { get { return mvarPropertyValueSuffix; } set { mvarPropertyValueSuffix = value; } } + + private string mvarPropertySeparator = ";"; + public string PropertySeparator { get { return mvarPropertySeparator; } set { mvarPropertySeparator = value; } } + + private string mvarMultiLineCommentStart = "/*"; + public string MultiLineCommentStart { get { return mvarMultiLineCommentStart; } set { mvarMultiLineCommentStart = value; } } + + private string mvarMultiLineCommentEnd = "*/"; + public string MultiLineCommentEnd { get { return mvarMultiLineCommentEnd; } set { mvarMultiLineCommentEnd = value; } } + + private string mvarSingleLineCommentStart = "//"; + public string SingleLineCommentStart { get { return mvarSingleLineCommentStart; } set { mvarSingleLineCommentStart = value; } } + + private string mvarGroupStart = "{"; + public string GroupStart { get { return mvarGroupStart; } set { mvarGroupStart = value; } } + + private string mvarGroupEnd = "}"; + public string GroupEnd { get { return mvarGroupEnd; } set { mvarGroupEnd = value; } } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj b/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj index e08a5658..7d50c729 100644 --- a/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj +++ b/CSharp/Plugins/UniversalEditor.Essential/UniversalEditor.Essential.csproj @@ -51,6 +51,8 @@ + +