// Token: 0x06006EAF RID: 28335 RVA: 0x001FC9DC File Offset: 0x001FABDC
 private static void TryFlushTextToBamlNode(BamlTreeNode parent, StringBuilder textContent)
 {
     if (textContent.Length > 0)
     {
         BamlTreeNode child = new BamlTextNode(textContent.ToString());
         parent.AddChild(child);
         textContent.Length = 0;
     }
 }
 private static void TryFlushTextToBamlNode(BamlTreeNode parent, StringBuilder textContent) 
 { 
     if (textContent.Length > 0)
     { 
         BamlTreeNode textNode  = new BamlTextNode(textContent.ToString());
         parent.AddChild(textNode);
         textContent.Length = 0;
     } 
 }
        private static void MergeChildrenList( 
            BamlLocalizableResourceKey  key, 
            BamlTreeUpdateMap           treeMap,
            BamlTreeNode                parent, 
            IList<BamlTreeNode>         newChildren
            )
        {
            if (newChildren == null) return; 

            List<BamlTreeNode> oldChildren = parent.Children; 
 
            int nodeIndex = 0;
            StringBuilder textBuffer = new StringBuilder(); 
            if (oldChildren != null)
            {
                Hashtable uidSubstitutions = new Hashtable(newChildren.Count);
                foreach (BamlTreeNode node in newChildren) 
                {
                    if (node.NodeType == BamlNodeType.StartElement) 
                    { 
                        BamlStartElementNode element = (BamlStartElementNode) node;
 
                        // element's Uid can be null if it is a formatting tag.
                        if (element.Uid != null)
                        {
                            if (uidSubstitutions.ContainsKey(element.Uid)) 
                            {
                                treeMap.Resolver.RaiseErrorNotifyEvent( 
                                    new BamlLocalizerErrorNotifyEventArgs( 
                                        key,
                                        BamlLocalizerError.DuplicateElement 
                                        )
                                    );
                                return; // the substitution contains duplicate elements.
                            } 

                            uidSubstitutions[element.Uid] = null;  // stored in Hashtable 
                        } 
                    }
                } 

                parent.Children = null; // start re-adding child element to parent

                // The last node is EndStartElement node and must remain to be at the end, 
                // so it won't be rearranged.
                for (int i = 0; i < oldChildren.Count - 1; i++) 
                { 
                    BamlTreeNode child = oldChildren[i];
                    switch (child.NodeType) 
                    {
                        case BamlNodeType.StartElement:
                        {
                            BamlStartElementNode element = (BamlStartElementNode) child; 

                            if (element.Uid != null) 
                            { 
                                if (!uidSubstitutions.ContainsKey(element.Uid))
                                { 
                                    // cannot apply uid susbstitution because the susbstituition doesn't
                                    // contain all the existing uids.
                                    parent.Children = oldChildren; // reset to old children and exit
                                    treeMap.Resolver.RaiseErrorNotifyEvent( 
                                        new BamlLocalizerErrorNotifyEventArgs(
                                            key, 
                                            BamlLocalizerError.MismatchedElements 
                                            )
                                    ); 

                                    return;
                                }
 
                                // Each Uid can only appear once.
                                uidSubstitutions.Remove(element.Uid); 
                            } 

                            // Append all the contents till the matching element. 
                            while (nodeIndex < newChildren.Count)
                            {
                                BamlTreeNode newNode = newChildren[nodeIndex++];
                                Invariant.Assert(newNode != null); 

                                if (newNode.NodeType == BamlNodeType.Text) 
                                { 
                                    textBuffer.Append(((BamlTextNode) newNode).Content); // Collect all text into the buffer
                                } 
                                else
                                {
                                    TryFlushTextToBamlNode(parent, textBuffer);
                                    parent.AddChild(newNode); 

                                    if (newNode.NodeType == BamlNodeType.StartElement) 
                                        break; 
                                }
                            } 

                            break;
                        }
                        case BamlNodeType.Text: 
                        {
                            // Skip original text node. New text node will be created from 
                            // text tokens in translation 
                            break;
                        } 
                        default:
                        {
                            parent.AddChild(child);
                            break; 
                        }
                    } 
                } 
            }
 
            // finish the rest of the nodes
            for (; nodeIndex < newChildren.Count; nodeIndex++)
            {
                BamlTreeNode newNode = newChildren[nodeIndex]; 
                Invariant.Assert(newNode != null);
 
                if (newNode.NodeType == BamlNodeType.Text) 
                {
                    textBuffer.Append(((BamlTextNode) newNode).Content); // Collect all text into the buffer 
                }
                else
                {
                    TryFlushTextToBamlNode(parent, textBuffer); 
                    parent.AddChild(newNode);
                } 
            } 

            TryFlushTextToBamlNode(parent, textBuffer); 

            // Always terminate the list with EndElementNode;
            parent.AddChild(new BamlEndElementNode());
        } 
        // Token: 0x06006EAC RID: 28332 RVA: 0x001FC674 File Offset: 0x001FA874
        private static bool ApplyChangeToBamlTree(BamlLocalizableResourceKey key, BamlLocalizableResource resource, BamlTreeUpdater.BamlTreeUpdateMap treeMap)
        {
            if (resource == null || resource.Content == null || !resource.Modifiable)
            {
                return(true);
            }
            if (!treeMap.LocalizationDictionary.Contains(key) && !treeMap.IsNewBamlTreeNode(key))
            {
                return(true);
            }
            BamlTreeNode bamlTreeNode = treeMap.MapKeyToBamlTreeNode(key);

            Invariant.Assert(bamlTreeNode != null);
            BamlNodeType nodeType = bamlTreeNode.NodeType;

            if (nodeType != BamlNodeType.StartElement)
            {
                if (nodeType != BamlNodeType.Property)
                {
                    if (nodeType == BamlNodeType.LiteralContent)
                    {
                        BamlLiteralContentNode bamlLiteralContentNode = (BamlLiteralContentNode)bamlTreeNode;
                        bamlLiteralContentNode.Content = BamlResourceContentUtil.UnescapeString(resource.Content);
                        if (bamlLiteralContentNode.Parent == null)
                        {
                            BamlTreeNode bamlTreeNode2 = treeMap.MapUidToBamlTreeElementNode(key.Uid);
                            if (bamlTreeNode2 == null)
                            {
                                return(false);
                            }
                            bamlTreeNode2.AddChild(bamlLiteralContentNode);
                        }
                    }
                }
                else
                {
                    BamlPropertyNode bamlPropertyNode = (BamlPropertyNode)bamlTreeNode;
                    bamlPropertyNode.Value = BamlResourceContentUtil.UnescapeString(resource.Content);
                    if (bamlPropertyNode.Parent == null)
                    {
                        BamlStartElementNode bamlStartElementNode = treeMap.MapUidToBamlTreeElementNode(key.Uid);
                        if (bamlStartElementNode == null)
                        {
                            return(false);
                        }
                        bamlStartElementNode.InsertProperty(bamlTreeNode);
                    }
                }
            }
            else
            {
                string b = null;
                if (treeMap.LocalizationDictionary.Contains(key))
                {
                    b = treeMap.LocalizationDictionary[key].Content;
                }
                if (resource.Content != b)
                {
                    BamlTreeUpdater.ReArrangeChildren(key, bamlTreeNode, resource.Content, treeMap);
                }
            }
            return(true);
        }
        // Token: 0x06006EAE RID: 28334 RVA: 0x001FC7C0 File Offset: 0x001FA9C0
        private static void MergeChildrenList(BamlLocalizableResourceKey key, BamlTreeUpdater.BamlTreeUpdateMap treeMap, BamlTreeNode parent, IList <BamlTreeNode> newChildren)
        {
            if (newChildren == null)
            {
                return;
            }
            List <BamlTreeNode> children = parent.Children;
            int           i             = 0;
            StringBuilder stringBuilder = new StringBuilder();

            if (children != null)
            {
                Hashtable hashtable = new Hashtable(newChildren.Count);
                foreach (BamlTreeNode bamlTreeNode in newChildren)
                {
                    if (bamlTreeNode.NodeType == BamlNodeType.StartElement)
                    {
                        BamlStartElementNode bamlStartElementNode = (BamlStartElementNode)bamlTreeNode;
                        if (bamlStartElementNode.Uid != null)
                        {
                            if (hashtable.ContainsKey(bamlStartElementNode.Uid))
                            {
                                treeMap.Resolver.RaiseErrorNotifyEvent(new BamlLocalizerErrorNotifyEventArgs(key, BamlLocalizerError.DuplicateElement));
                                return;
                            }
                            hashtable[bamlStartElementNode.Uid] = null;
                        }
                    }
                }
                parent.Children = null;
                for (int j = 0; j < children.Count - 1; j++)
                {
                    BamlTreeNode bamlTreeNode2 = children[j];
                    BamlNodeType nodeType      = bamlTreeNode2.NodeType;
                    if (nodeType != BamlNodeType.StartElement)
                    {
                        if (nodeType != BamlNodeType.Text)
                        {
                            parent.AddChild(bamlTreeNode2);
                        }
                    }
                    else
                    {
                        BamlStartElementNode bamlStartElementNode2 = (BamlStartElementNode)bamlTreeNode2;
                        if (bamlStartElementNode2.Uid != null)
                        {
                            if (!hashtable.ContainsKey(bamlStartElementNode2.Uid))
                            {
                                parent.Children = children;
                                treeMap.Resolver.RaiseErrorNotifyEvent(new BamlLocalizerErrorNotifyEventArgs(key, BamlLocalizerError.MismatchedElements));
                                return;
                            }
                            hashtable.Remove(bamlStartElementNode2.Uid);
                        }
                        while (i < newChildren.Count)
                        {
                            BamlTreeNode bamlTreeNode3 = newChildren[i++];
                            Invariant.Assert(bamlTreeNode3 != null);
                            if (bamlTreeNode3.NodeType == BamlNodeType.Text)
                            {
                                stringBuilder.Append(((BamlTextNode)bamlTreeNode3).Content);
                            }
                            else
                            {
                                BamlTreeUpdater.TryFlushTextToBamlNode(parent, stringBuilder);
                                parent.AddChild(bamlTreeNode3);
                                if (bamlTreeNode3.NodeType == BamlNodeType.StartElement)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            while (i < newChildren.Count)
            {
                BamlTreeNode bamlTreeNode4 = newChildren[i];
                Invariant.Assert(bamlTreeNode4 != null);
                if (bamlTreeNode4.NodeType == BamlNodeType.Text)
                {
                    stringBuilder.Append(((BamlTextNode)bamlTreeNode4).Content);
                }
                else
                {
                    BamlTreeUpdater.TryFlushTextToBamlNode(parent, stringBuilder);
                    parent.AddChild(bamlTreeNode4);
                }
                i++;
            }
            BamlTreeUpdater.TryFlushTextToBamlNode(parent, stringBuilder);
            parent.AddChild(new BamlEndElementNode());
        }
        private static void MergeChildrenList(
            BamlLocalizableResourceKey key,
            BamlTreeUpdateMap treeMap,
            BamlTreeNode parent,
            IList <BamlTreeNode> newChildren
            )
        {
            if (newChildren == null)
            {
                return;
            }

            List <BamlTreeNode> oldChildren = parent.Children;

            int           nodeIndex  = 0;
            StringBuilder textBuffer = new StringBuilder();

            if (oldChildren != null)
            {
                Hashtable uidSubstitutions = new Hashtable(newChildren.Count);
                foreach (BamlTreeNode node in newChildren)
                {
                    if (node.NodeType == BamlNodeType.StartElement)
                    {
                        BamlStartElementNode element = (BamlStartElementNode)node;

                        // element's Uid can be null if it is a formatting tag.
                        if (element.Uid != null)
                        {
                            if (uidSubstitutions.ContainsKey(element.Uid))
                            {
                                treeMap.Resolver.RaiseErrorNotifyEvent(
                                    new BamlLocalizerErrorNotifyEventArgs(
                                        key,
                                        BamlLocalizerError.DuplicateElement
                                        )
                                    );
                                return; // the substitution contains duplicate elements.
                            }

                            uidSubstitutions[element.Uid] = null;  // stored in Hashtable
                        }
                    }
                }

                parent.Children = null; // start re-adding child element to parent

                // The last node is EndStartElement node and must remain to be at the end,
                // so it won't be rearranged.
                for (int i = 0; i < oldChildren.Count - 1; i++)
                {
                    BamlTreeNode child = oldChildren[i];
                    switch (child.NodeType)
                    {
                    case BamlNodeType.StartElement:
                    {
                        BamlStartElementNode element = (BamlStartElementNode)child;

                        if (element.Uid != null)
                        {
                            if (!uidSubstitutions.ContainsKey(element.Uid))
                            {
                                // cannot apply uid susbstitution because the susbstituition doesn't
                                // contain all the existing uids.
                                parent.Children = oldChildren;     // reset to old children and exit
                                treeMap.Resolver.RaiseErrorNotifyEvent(
                                    new BamlLocalizerErrorNotifyEventArgs(
                                        key,
                                        BamlLocalizerError.MismatchedElements
                                        )
                                    );

                                return;
                            }

                            // Each Uid can only appear once.
                            uidSubstitutions.Remove(element.Uid);
                        }

                        // Append all the contents till the matching element.
                        while (nodeIndex < newChildren.Count)
                        {
                            BamlTreeNode newNode = newChildren[nodeIndex++];
                            Invariant.Assert(newNode != null);

                            if (newNode.NodeType == BamlNodeType.Text)
                            {
                                textBuffer.Append(((BamlTextNode)newNode).Content);      // Collect all text into the buffer
                            }
                            else
                            {
                                TryFlushTextToBamlNode(parent, textBuffer);
                                parent.AddChild(newNode);

                                if (newNode.NodeType == BamlNodeType.StartElement)
                                {
                                    break;
                                }
                            }
                        }

                        break;
                    }

                    case BamlNodeType.Text:
                    {
                        // Skip original text node. New text node will be created from
                        // text tokens in translation
                        break;
                    }

                    default:
                    {
                        parent.AddChild(child);
                        break;
                    }
                    }
                }
            }

            // finish the rest of the nodes
            for (; nodeIndex < newChildren.Count; nodeIndex++)
            {
                BamlTreeNode newNode = newChildren[nodeIndex];
                Invariant.Assert(newNode != null);

                if (newNode.NodeType == BamlNodeType.Text)
                {
                    textBuffer.Append(((BamlTextNode)newNode).Content);  // Collect all text into the buffer
                }
                else
                {
                    TryFlushTextToBamlNode(parent, textBuffer);
                    parent.AddChild(newNode);
                }
            }

            TryFlushTextToBamlNode(parent, textBuffer);

            // Always terminate the list with EndElementNode;
            parent.AddChild(new BamlEndElementNode());
        }
        private static bool ApplyChangeToBamlTree(
            BamlLocalizableResourceKey key,
            BamlLocalizableResource resource,
            BamlTreeUpdateMap treeMap
            )
        {
            if (resource == null ||
                resource.Content == null ||
                !resource.Modifiable)
            {
                // Invalid translation or the resource is marked as non-modifiable.
                return(true);
            }

            if (!treeMap.LocalizationDictionary.Contains(key) &&
                !treeMap.IsNewBamlTreeNode(key))
            {
                // A localizable node is either in the localization dicationary extracted
                // from the source or it is a new node created by the localizer.
                // Otherwise, we cannot modify it.
                return(true);
            }

            // get the node, at this point, all the missing nodes are created
            BamlTreeNode node = treeMap.MapKeyToBamlTreeNode(key);

            Invariant.Assert(node != null);

            // apply translations
            switch (node.NodeType)
            {
            case BamlNodeType.LiteralContent:
            {
                BamlLiteralContentNode literalNode = (BamlLiteralContentNode)node;

                // set the content to the node.
                literalNode.Content = BamlResourceContentUtil.UnescapeString(resource.Content);

                // now try to link this node into the parent.
                if (literalNode.Parent == null)
                {
                    BamlTreeNode parent = treeMap.MapUidToBamlTreeElementNode(key.Uid);
                    if (parent != null)
                    {
                        // link it up with the parent
                        parent.AddChild(literalNode);
                    }
                    else
                    {
                        return(false);    // can't resolve the parent yet
                    }
                }
                break;
            }

            case BamlNodeType.Property:
            {
                BamlPropertyNode propertyNode = (BamlPropertyNode)node;

                // set the translation into the property
                propertyNode.Value = BamlResourceContentUtil.UnescapeString(resource.Content);

                // now try to link this node into the parent
                if (propertyNode.Parent == null)
                {
                    BamlStartElementNode parent = (BamlStartElementNode)treeMap.MapUidToBamlTreeElementNode(key.Uid);
                    if (parent != null)
                    {
                        // insert property node to the parent
                        parent.InsertProperty(node);
                    }
                    else
                    {
                        return(false);
                    }
                }
                break;
            }

            case BamlNodeType.StartElement:
            {
                string source = null;
                if (treeMap.LocalizationDictionary.Contains(key))
                {
                    source = ((BamlLocalizableResource)treeMap.LocalizationDictionary[key]).Content;
                }

                if (resource.Content != source)
                {
                    // only rearrange the value if source and update are different
                    ReArrangeChildren(key, node, resource.Content, treeMap);
                }

                break;
            }

            default:
                break;
            }


            return(true);
        }