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