コード例 #1
0
        /// <inheritdoc />
        public override void Apply(XmlDocument document, string key)
        {
            foreach (XPathNavigator node in document.CreateNavigator().Select(selector).ToArray())
            {
                string reference = node.Value;

                // check for validity of reference
                if (validSnippetReference.IsMatch(reference))
                {
                    var identifiers = SnippetIdentifier.ParseReference(reference);

                    if (identifiers.Count() == 1)
                    {
                        // one snippet referenced

                        SnippetIdentifier    identifier = identifiers.First();
                        List <StoredSnippet> values;

                        if (snippets.TryGetValue(identifier, out values))
                        {
                            XmlWriter writer = node.InsertAfter();
                            writer.WriteStartElement("snippets");
                            writer.WriteAttributeString("reference", reference);

                            foreach (StoredSnippet value in values)
                            {
                                writer.WriteStartElement("snippet");
                                writer.WriteAttributeString("language", value.Language);

                                if (colorization.ContainsKey(value.Language))
                                {
                                    WriteColorizedSnippet(ColorizeSnippet(value.Text, colorization[value.Language]), writer);
                                }
                                else
                                {
                                    writer.WriteString(value.Text);
                                }

                                writer.WriteEndElement();
                            }

                            writer.WriteEndElement();
                            writer.Close();
                        }
                        else
                        {
                            base.WriteMessage(key, MessageLevel.Warn, "No snippet with identifier '{0}' was found.", identifier);
                        }
                    }
                    else
                    {
                        // multiple snippets referenced

                        // create structure that maps language -> snippets
                        Dictionary <string, List <StoredSnippet> > map = new Dictionary <string, List <StoredSnippet> >();

                        foreach (SnippetIdentifier identifier in identifiers)
                        {
                            List <StoredSnippet> values;

                            if (snippets.TryGetValue(identifier, out values))
                            {
                                foreach (StoredSnippet value in values)
                                {
                                    List <StoredSnippet> pieces;
                                    if (!map.TryGetValue(value.Language, out pieces))
                                    {
                                        pieces = new List <StoredSnippet>();
                                        map.Add(value.Language, pieces);
                                    }
                                    pieces.Add(value);
                                }
                            }
                        }

                        XmlWriter writer = node.InsertAfter();
                        writer.WriteStartElement("snippets");
                        writer.WriteAttributeString("reference", reference);

                        foreach (KeyValuePair <string, List <StoredSnippet> > entry in map)
                        {
                            writer.WriteStartElement("snippet");
                            writer.WriteAttributeString("language", entry.Key);

                            List <StoredSnippet> values = entry.Value;
                            for (int i = 0; i < values.Count; i++)
                            {
                                if (i > 0)
                                {
                                    writer.WriteString("\n\n...\n\n");
                                }

                                writer.WriteString(values[i].Text);
                            }

                            writer.WriteEndElement();
                        }

                        writer.WriteEndElement();
                        writer.Close();
                    }
                }
                else
                {
                    base.WriteMessage(key, MessageLevel.Warn, "The code reference '{0}' is not well-formed", reference);
                }

                node.DeleteSelf();
            }
        }