// 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()); }
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); }