Beispiel #1
0
        // ICU4N specific - de-nested Node class

        // ICU4N specific - de-nested MessageNode class

        // ICU4N specific - de-nested MessageContentsNode class

        // ICU4N specific - de-nested TextNode class

        // ICU4N specific - de-nested ArgNode class

        // ICU4N specific - de-nested ComplexArgStyleNode class

        // ICU4N specific - de-nested VariantNode class

        private static MessageNode BuildMessageNode(MessagePattern pattern, int start, int limit)
        {
            int         prevPatternIndex = pattern.GetPart(start).Limit;
            MessageNode node             = new MessageNode();

            for (int i = start + 1; ; ++i)
            {
                MessagePatternPart part = pattern.GetPart(i);
                int patternIndex        = part.Index;
                if (prevPatternIndex < patternIndex)
                {
                    node.AddContentsNode(
                        new TextNode(pattern.PatternString.Substring(prevPatternIndex, patternIndex - prevPatternIndex)));     // ICU4N: Corrected 2nd arg
                }
                if (i == limit)
                {
                    break;
                }
                MessagePatternPartType partType = part.Type;
                if (partType == MessagePatternPartType.ArgStart)
                {
                    int argLimit = pattern.GetLimitPartIndex(i);
                    node.AddContentsNode(BuildArgNode(pattern, i, argLimit));
                    i    = argLimit;
                    part = pattern.GetPart(i);
                }
                else if (partType == MessagePatternPartType.ReplaceNumber)
                {
                    node.AddContentsNode(MessageContentsNode.CreateReplaceNumberNode());
                    // else: ignore SKIP_SYNTAX and INSERT_CHAR parts.
                }
                prevPatternIndex = part.Limit;
            }
            return(node.Freeze());
        }
Beispiel #2
0
 internal void AddContentsNode(MessageContentsNode node)
 {
     if (node is TextNode && list.Any())
     {
         // Coalesce adjacent text nodes.
         MessageContentsNode lastNode = list[list.Count - 1];
         if (lastNode is TextNode)
         {
             TextNode textNode = (TextNode)lastNode;
             textNode.Text = textNode.Text + ((TextNode)node).Text;
             return;
         }
     }
     list.Add(node);
 }