diff options
author | Lluis Sanchez Gual <lluis@xamarin.com> | 2012-10-18 12:41:42 +0400 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@xamarin.com> | 2012-10-18 12:41:42 +0400 |
commit | cb4c214c37dd8d023aca94872e727672da34cf67 (patch) | |
tree | 29a76bde582d2a1d3163b00a6cc4163bff6713e5 /Mono.Addins | |
parent | fa5d97b17ce01901e708753a54c13da662e6dc66 (diff) |
Add support for variables
Diffstat (limited to 'Mono.Addins')
4 files changed, 135 insertions, 34 deletions
diff --git a/Mono.Addins/Mono.Addins.Description/AddinDependency.cs b/Mono.Addins/Mono.Addins.Description/AddinDependency.cs index adc0d29..b0ff364 100644 --- a/Mono.Addins/Mono.Addins.Description/AddinDependency.cs +++ b/Mono.Addins/Mono.Addins.Description/AddinDependency.cs @@ -123,7 +123,7 @@ namespace Mono.Addins.Description /// The addin identifier. /// </value> public string AddinId { - get { return id != null ? id : string.Empty; } + get { return id != null ? ParseString (id) : string.Empty; } set { id = value; } } @@ -134,7 +134,7 @@ namespace Mono.Addins.Description /// The version. /// </value> public string Version { - get { return version != null ? version : string.Empty; } + get { return version != null ? ParseString (version) : string.Empty; } set { version = value; } } @@ -145,7 +145,7 @@ namespace Mono.Addins.Description /// The name. /// </value> public override string Name { - get { return AddinId + " v" + version; } + get { return AddinId + " v" + Version; } } internal override bool CheckInstalled (AddinRegistry registry) @@ -162,8 +162,8 @@ namespace Mono.Addins.Description internal override void Write (BinaryXmlWriter writer) { base.Write (writer); - writer.WriteValue ("id", id); - writer.WriteValue ("version", version); + writer.WriteValue ("id", ParseString (id)); + writer.WriteValue ("version", ParseString (version)); } internal override void Read (BinaryXmlReader reader) diff --git a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs index 9d0e872..3799751 100644 --- a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs +++ b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs @@ -35,6 +35,7 @@ using System.Xml.Serialization; using System.Collections.Specialized; using Mono.Addins.Serialization; using Mono.Addins.Database; +using System.Text; namespace Mono.Addins.Description { @@ -79,6 +80,7 @@ namespace Mono.Addins.Description object[] fileInfo; AddinPropertyCollectionImpl properties; + Dictionary<string,string> variables; internal static BinaryXmlTypeMap typeMap; @@ -137,7 +139,7 @@ namespace Mono.Addins.Description /// The local identifier. /// </value> public string LocalId { - get { return id != null ? id : string.Empty; } + get { return id != null ? ParseString (id) : string.Empty; } set { id = value; hasUserId = true; } } @@ -148,7 +150,7 @@ namespace Mono.Addins.Description /// The namespace. /// </value> public string Namespace { - get { return ns != null ? ns : string.Empty; } + get { return ns != null ? ParseString (ns) : string.Empty; } set { ns = value; } } @@ -164,7 +166,7 @@ namespace Mono.Addins.Description if (val.Length > 0) return val; if (name != null && name.Length > 0) - return name; + return ParseString (name); if (HasUserId) return AddinId; else if (sourceAddinFile != null) @@ -182,7 +184,7 @@ namespace Mono.Addins.Description /// The version. /// </value> public string Version { - get { return version != null ? version : string.Empty; } + get { return version != null ? ParseString (version) : string.Empty; } set { version = value; } } @@ -193,7 +195,7 @@ namespace Mono.Addins.Description /// The compat version. /// </value> public string CompatVersion { - get { return compatVersion != null ? compatVersion : string.Empty; } + get { return compatVersion != null ? ParseString (compatVersion) : string.Empty; } set { compatVersion = value; } } @@ -208,7 +210,7 @@ namespace Mono.Addins.Description string val = Properties.GetPropertyValue ("Author"); if (val.Length > 0) return val; - return author ?? string.Empty; + return ParseString (author) ?? string.Empty; } set { author = value; } } @@ -224,7 +226,7 @@ namespace Mono.Addins.Description string val = Properties.GetPropertyValue ("Url"); if (val.Length > 0) return val; - return url ?? string.Empty; + return ParseString (url) ?? string.Empty; } set { url = value; } } @@ -240,7 +242,7 @@ namespace Mono.Addins.Description string val = Properties.GetPropertyValue ("Copyright"); if (val.Length > 0) return val; - return copyright ?? string.Empty; + return ParseString (copyright) ?? string.Empty; } set { copyright = value; } } @@ -256,7 +258,7 @@ namespace Mono.Addins.Description string val = Properties.GetPropertyValue ("Description"); if (val.Length > 0) return val; - return description ?? string.Empty; + return ParseString (description) ?? string.Empty; } set { description = value; } } @@ -272,7 +274,7 @@ namespace Mono.Addins.Description string val = Properties.GetPropertyValue ("Category"); if (val.Length > 0) return val; - return category ?? string.Empty; + return ParseString (category) ?? string.Empty; } set { category = value; } } @@ -542,7 +544,7 @@ namespace Mono.Addins.Description public AddinPropertyCollection Properties { get { if (properties == null) - properties = new AddinPropertyCollectionImpl (); + properties = new AddinPropertyCollectionImpl (this); return properties; } } @@ -755,7 +757,7 @@ namespace Mono.Addins.Description } elem = configDoc.DocumentElement; - + SaveCoreProperty (elem, HasUserId ? id : null, "id", "Id"); SaveCoreProperty (elem, version, "version", "Version"); SaveCoreProperty (elem, ns, "namespace", "Namespace"); @@ -841,6 +843,27 @@ namespace Mono.Addins.Description oldHeader.AppendChild (propElem); } } + + XmlElement oldVars = (XmlElement) elem.SelectSingleNode ("Variables"); + if (variables == null || variables.Count == 0) { + if (oldVars != null) + elem.RemoveChild (oldVars); + } else { + if (oldVars == null) { + oldVars = elem.OwnerDocument.CreateElement ("Variables"); + if (elem.FirstChild != null) + elem.InsertBefore (oldVars, elem.FirstChild); + else + elem.AppendChild (oldVars); + } + else + oldVars.RemoveAll (); + foreach (var prop in variables) { + XmlElement propElem = elem.OwnerDocument.CreateElement (prop.Key); + propElem.InnerText = prop.Value ?? string.Empty; + oldVars.AppendChild (propElem); + } + } } void SaveCoreProperty (XmlElement elem, string val, string attr, string prop) @@ -908,11 +931,23 @@ namespace Mono.Addins.Description } catch (Exception ex) { throw new InvalidOperationException ("The add-in configuration file is invalid: " + ex.Message, ex); } - + XmlElement elem = config.configDoc.DocumentElement; if (elem.LocalName == "ExtensionModel") return config; + XmlElement varsElem = (XmlElement) elem.SelectSingleNode ("Variables"); + if (varsElem != null) { + foreach (XmlNode node in varsElem.ChildNodes) { + XmlElement prop = node as XmlElement; + if (prop == null) + continue; + if (config.variables == null) + config.variables = new Dictionary<string, string> (); + config.variables [prop.LocalName] = prop.InnerText; + } + } + config.id = elem.GetAttribute ("id"); config.ns = elem.GetAttribute ("namespace"); config.name = elem.GetAttribute ("name"); @@ -948,7 +983,7 @@ namespace Mono.Addins.Description XmlElement prop = node as XmlElement; if (prop == null) continue; - config.Properties.SetPropertyValue (prop.LocalName, prop.InnerText, prop.GetAttribute ("locale")); + config.Properties.SetPropertyValue (prop.LocalName, prop.InnerText, prop.GetAttribute ("locale")); } } @@ -959,6 +994,48 @@ namespace Mono.Addins.Description return config; } + + internal string ParseString (string input) + { + if (input == null || input.Length < 4 || variables == null || variables.Count == 0) + return input; + + int i = input.IndexOf ("$("); + if (i == -1) + return input; + + StringBuilder result = new StringBuilder (input.Substring (0, i), input.Length); + + while (i < input.Length) { + if (input [i] == '$') { + i++; + + if (i >= input.Length || input[i] != '(') { + result.Append ('$'); + continue; + } + + i++; + int start = i; + while (i < input.Length && input [i] != ')') + i++; + + string tag = input.Substring (start, i - start); + + string tagValue; + if (variables.TryGetValue (tag, out tagValue)) + result.Append (tagValue); + else { + result.Append ('$'); + i = start - 1; + } + } else { + result.Append (input [i]); + } + i++; + } + return result.ToString (); + } static bool GetBool (string s, bool defval) { @@ -1124,18 +1201,18 @@ namespace Mono.Addins.Description void IBinaryXmlElement.Write (BinaryXmlWriter writer) { TransferCoreProperties (true); - writer.WriteValue ("id", id); - writer.WriteValue ("ns", ns); + writer.WriteValue ("id", ParseString (id)); + writer.WriteValue ("ns", ParseString (ns)); writer.WriteValue ("isroot", isroot); - writer.WriteValue ("name", name); - writer.WriteValue ("version", version); - writer.WriteValue ("compatVersion", compatVersion); + writer.WriteValue ("name", ParseString (name)); + writer.WriteValue ("version", ParseString (version)); + writer.WriteValue ("compatVersion", ParseString (compatVersion)); writer.WriteValue ("hasUserId", hasUserId); - writer.WriteValue ("author", author); - writer.WriteValue ("url", url); - writer.WriteValue ("copyright", copyright); - writer.WriteValue ("description", description); - writer.WriteValue ("category", category); + writer.WriteValue ("author", ParseString (author)); + writer.WriteValue ("url", ParseString (url)); + writer.WriteValue ("copyright", ParseString (copyright)); + writer.WriteValue ("description", ParseString (description)); + writer.WriteValue ("category", ParseString (category)); writer.WriteValue ("basePath", basePath); writer.WriteValue ("sourceAddinFile", sourceAddinFile); writer.WriteValue ("defaultEnabled", defaultEnabled); @@ -1177,7 +1254,7 @@ namespace Mono.Addins.Description fileInfo = (object[]) reader.ReadValue ("FilesInfo", null); localizer = (ExtensionNodeDescription) reader.ReadValue ("Localizer"); flags = (AddinFlags) reader.ReadInt32Value ("flags"); - properties = (AddinPropertyCollectionImpl) reader.ReadValue ("Properties", new AddinPropertyCollectionImpl ()); + properties = (AddinPropertyCollectionImpl) reader.ReadValue ("Properties", new AddinPropertyCollectionImpl (this)); if (mainModule != null) mainModule.SetParent (this); diff --git a/Mono.Addins/Mono.Addins.Description/AddinPropertyCollection.cs b/Mono.Addins/Mono.Addins.Description/AddinPropertyCollection.cs index 204b2fa..3296b7c 100644 --- a/Mono.Addins/Mono.Addins.Description/AddinPropertyCollection.cs +++ b/Mono.Addins/Mono.Addins.Description/AddinPropertyCollection.cs @@ -113,10 +113,17 @@ namespace Mono.Addins.Description class AddinPropertyCollectionImpl: List<AddinProperty>, AddinPropertyCollection { + AddinDescription desc; + public AddinPropertyCollectionImpl () { } + public AddinPropertyCollectionImpl (AddinDescription desc) + { + this.desc = desc; + } + public AddinPropertyCollectionImpl (AddinPropertyCollection col) { AddRange (col); @@ -138,7 +145,7 @@ namespace Mono.Addins.Description foreach (var p in this) { if (p.Name == name) { if (p.Locale == locale) - return p.Value; + return ParseString (p.Value); string plang = GetLocaleLang (p.Locale); if (plang == p.Locale && plang == lang) // No country specified sameLang = p; @@ -149,14 +156,22 @@ namespace Mono.Addins.Description } } if (sameLang != null) - return sameLang.Value; + return ParseString (sameLang.Value); else if (sameLangDifCountry != null) - return sameLangDifCountry.Value; + return ParseString (sameLangDifCountry.Value); else if (defaultLoc != null) - return defaultLoc.Value; + return ParseString (defaultLoc.Value); else return string.Empty; } + + string ParseString (string s) + { + if (desc != null) + return desc.ParseString (s); + else + return s; + } string NormalizeLocale (string loc) { diff --git a/Mono.Addins/Mono.Addins.Description/ObjectDescription.cs b/Mono.Addins/Mono.Addins.Description/ObjectDescription.cs index 660c26a..4556c31 100644 --- a/Mono.Addins/Mono.Addins.Description/ObjectDescription.cs +++ b/Mono.Addins/Mono.Addins.Description/ObjectDescription.cs @@ -77,6 +77,15 @@ namespace Mono.Addins.Description return null; } } + + internal string ParseString (string s) + { + var desc = ParentAddinDescription; + if (desc != null) + return desc.ParseString (s); + else + return s; + } internal void SetParent (object ob) { |