/// <summary> /// Changes separator of existing rule, or creates new rule and uses Order 0. /// </summary> /// <param name="parameterName"></param> /// <param name="prefixSeparator"></param> /// <param name="postfixSeparator"></param> /// <returns>this</returns> public LineParameterPrinter Separator(string parameterName, string prefixSeparator = null, string postfixSeparator = null) { _Rule rule; if (parameters.TryGetValue(parameterName, out rule)) { rule.PrefixSeparator = prefixSeparator; rule.PostfixSeparator = postfixSeparator; } else { parameters[parameterName] = new _Rule(parameterName, true, prefixSeparator, postfixSeparator, 0); } return(this); }
/// <summary> /// Build key into a string. /// </summary> /// <param name="key"></param> /// <returns></returns> public string Print(ILine key) { // List for parts StructList16 <Part> parts = new StructList16 <Part>(Part.Comparer.Default); // Iterate key int occuranceIndex = 1; for (ILine part = key; part != null; part = part.GetPreviousPart()) { if (part is ILineParameter parametrized) { // Read parameter name and value string parameterName = parametrized.ParameterName, parameterValue = part.GetParameterValue(); if (string.IsNullOrEmpty(parameterName) || parameterValue == null) { continue; } // Get description _Rule desc = null; if (parameters.TryGetValue(parameterName, out desc) && !desc.IsIncluded) { continue; } // Try default descriptions if (desc == null && part is ILineCanonicalKey) { parameters.TryGetValue("canonical", out desc); } if (desc == null && part is ILineNonCanonicalKey) { parameters.TryGetValue("noncanonical", out desc); } if (desc == null) { parameters.TryGetValue("", out desc); } // No description if (desc == null) { continue; } // This parameter is disabled if (!desc.IsIncluded) { continue; } // Count occurance index occuranceIndex--; // Add to list parts.Add(new Part { ParameterName = parameterName, ParameterValue = parameterValue, Policy = desc, Order = desc.Order + occuranceIndex }); } } // Sort list sorter.Sort(ref parts); // Calculate char count int len = 0; for (int i = 0; i < parts.Count; i++) { len += parts[i].ParameterValue.Length; // Count in separator if (i > 0) { string separator = parts[i - 1].Policy.PostfixSeparator; if (separator != null) { len += separator.Length; } else { separator = parts[i].Policy.PrefixSeparator; if (separator != null) { len += separator.Length; } } } } // Put together a string char[] chars = new char[len]; int ix = 0; for (int i = 0; i < parts.Count; i++) { string s; // Add separator if (i > 0) { s = parts[i - 1].Policy.PostfixSeparator; if (s != null) { s.CopyTo(0, chars, ix, s.Length); ix += s.Length; } else { s = parts[i].Policy.PrefixSeparator; if (s != null) { s.CopyTo(0, chars, ix, s.Length); ix += s.Length; } } } // Add text s = parts[i].ParameterValue; s.CopyTo(0, chars, ix, s.Length); ix += s.Length; } return(new string(chars)); }
/// <summary> /// Set rule for unknown parameterNames. This is the last rule that is applied. /// </summary> /// <param name="isIncluded"></param> /// <param name="prefixSeparator"></param> /// <param name="postfixSeparator"></param> /// <param name="order"></param> /// <returns>this</returns> public LineParameterPrinter DefaultRule(bool isIncluded, string prefixSeparator = null, string postfixSeparator = null, int order = 0) { parameters[""] = new _Rule("", isIncluded, prefixSeparator, postfixSeparator, order); return(this); }
/// <summary> /// Set default rule for unmatched non-canonical key. Applied if there were no policy match with specific parameter name. /// </summary> /// <param name="isIncluded"></param> /// <param name="prefixSeparator"></param> /// <param name="postfixSeparator"></param> /// <param name="order"></param> /// <returns>this</returns> public LineParameterPrinter NonCanonicalRule(bool isIncluded, string prefixSeparator = null, string postfixSeparator = null, int order = 0) { parameters["noncanonical"] = new _Rule("noncanonical", isIncluded, prefixSeparator, postfixSeparator, order); return(this); }
/// <summary> /// Set rule for a specific <paramref name="parameterName"/>. /// </summary> /// <param name="parameterName">parameter name, for example "Culture", "Section", "Key", etc</param> /// <param name="isIncluded">true, parameter is included in name. False, parameter is not to be included. </param> /// <param name="prefixSeparator"></param> /// <param name="postfixSeparator"></param> /// <param name="order"></param> /// <returns>this</returns> public LineParameterPrinter Rule(string parameterName, bool isIncluded, string prefixSeparator = null, string postfixSeparator = null, int order = 0) { parameters[parameterName] = new _Rule(parameterName, isIncluded, prefixSeparator, postfixSeparator, order); return(this); }
/// <summary> /// Sets rule to not to include <paramref name="parameterName"/>, for example "Root". /// </summary> /// <param name="parameterName"></param> /// <returns>this</returns> public LineParameterPrinter Ignore(string parameterName) { parameters[parameterName] = new _Rule(parameterName, false, null, null, 0); return(this); }
/// <summary> /// Get indexed parameter. /// </summary> /// <param name="name"></param> /// <returns></returns> public _Rule this[string name] { get { _Rule result = null; parameters.TryGetValue(name, out result); return(result); } }