コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
 /// <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);
 }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
 /// <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);
 }
コード例 #6
0
 /// <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);
 }
コード例 #7
0
 /// <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); }
 }