public static ConceptualLinkInfo Create(XPathNavigator node) { if (node == null) { throw new ArgumentNullException("node"); } ConceptualLinkInfo info = new ConceptualLinkInfo(); info.target = node.GetAttribute("target", String.Empty); info.text = node.ToString(); if (node.MoveToFirstAttribute()) { do { if (AllowedHtmlAttributes.Contains(node.Name)) { info.HtmlAttributes.Add(node.Name, node.Value); } }while (node.MoveToNextAttribute()); node.MoveToParent(); } return(info); }
private static void WriteHtmlAttributes(XmlWriter writer, ConceptualLinkInfo link) { foreach (var attribute in link.HtmlAttributes) { writer.WriteAttributeString(attribute.Key, attribute.Value); } }
public static ConceptualLinkInfo Create(XPathNavigator node) { if (node == null) { throw new ArgumentNullException("node"); } ConceptualLinkInfo info = new ConceptualLinkInfo(); info.target = node.GetAttribute("target", String.Empty); info.text = node.ToString(); return(info); }
private void ResolveConceptualLinks(XmlDocument document, string key) { // find links XPathNodeIterator linkIterator = document.CreateNavigator().Select(conceptualLinks); // copy them to an array, because enumerating through an XPathNodeIterator // fails when the nodes in it are altered XPathNavigator[] linkNodes = BuildComponentUtilities.ConvertNodeIteratorToArray(linkIterator); foreach (XPathNavigator linkNode in linkNodes) { ConceptualLinkInfo link = ConceptualLinkInfo.Create(linkNode); // determine url, text, and link type string url = null; string text = null; LinkType type = LinkType.None; bool isValidLink = validGuid.IsMatch(link.Target); if (isValidLink) { // a valid link; try to fetch target info TargetInfo target = GetTargetInfoFromCache(link.Target.ToLower()); if (target == null) { // no target found; issue warning, set link style to none, and text to in-source fall-back //type = LinkType.None; type = LinkType.Index; text = BrokenLinkDisplayText(link.Target, link.Text); WriteMessage(MessageLevel.Warn, String.Format("Unknown conceptual link target '{0}'.", link.Target)); } else { // found target; get url, text, and type from stored info url = target.Url; text = target.Text; type = target.Type; } } else { // not a valid link; issue warning, set link style to none, and text to invalid target //type = LinkType.None; type = LinkType.Index; text = BrokenLinkDisplayText(link.Target, link.Text); WriteMessage(MessageLevel.Warn, String.Format("Invalid conceptual link target '{0}'.", link.Target)); } // write opening link tag and target info XmlWriter writer = linkNode.InsertAfter(); switch (type) { case LinkType.None: writer.WriteStartElement("span"); writer.WriteAttributeString("class", "nolink"); break; case LinkType.Local: writer.WriteStartElement("a"); writer.WriteAttributeString("href", url); WriteHtmlAttributes(writer, link); break; case LinkType.Index: writer.WriteStartElement("mshelp", "link", "http://msdn.microsoft.com/mshelp"); writer.WriteAttributeString("keywords", link.Target.ToLower()); writer.WriteAttributeString("tabindex", "0"); break; case LinkType.Id: string xhelp = String.Format("ms-xhelp://?Id={0}", link.Target); writer.WriteStartElement("a"); writer.WriteAttributeString("href", xhelp); break; } // write the link text writer.WriteString(text); // write the closing link tag writer.WriteEndElement(); writer.Close(); // delete the original tag linkNode.DeleteSelf(); } }
public static ConceptualLinkInfo Create (XPathNavigator node) { if (node == null) throw new ArgumentNullException("node"); ConceptualLinkInfo info = new ConceptualLinkInfo(); info.target = node.GetAttribute("target", String.Empty); info.text = node.ToString(); return(info); }
/// <summary> /// This is implemented to resolve the conceptual links /// </summary> /// <param name="document">The XML document with which to work.</param> /// <param name="key">The key (member name) of the item being documented.</param> public override void Apply(XmlDocument document, string key) { ConceptualLinkInfo info; TargetInfo targetInfo; ConceptualLinkType linkType; string url, text; foreach (XPathNavigator navigator in document.CreateNavigator().Select(conceptualLinks).ToArray()) { info = new ConceptualLinkInfo(navigator); url = text = null; linkType = ConceptualLinkType.None; targetInfo = this.GetTargetInfoFromCache(info.Target); if (targetInfo == null) { // EFW - Removed linkType = Index, broken links should use the None style. text = this.BrokenLinkDisplayText(info.Target, info.Text); base.WriteMessage(key, MessageLevel.Warn, "Unknown conceptual link target '{0}'.", info.Target); } else { url = targetInfo.Url; // EFW - Append the anchor if one was specified if (!String.IsNullOrEmpty(info.Anchor)) { url += info.Anchor; } // EFW - Use the link text if specified if (!String.IsNullOrEmpty(info.Text)) { text = info.Text; } else { text = targetInfo.Text; } linkType = targetInfo.LinkType; } XmlWriter writer = navigator.InsertAfter(); switch (linkType) { case ConceptualLinkType.None: writer.WriteStartElement("span"); writer.WriteAttributeString("class", "nolink"); break; case ConceptualLinkType.Local: writer.WriteStartElement("a"); writer.WriteAttributeString("href", url); break; case ConceptualLinkType.Index: writer.WriteStartElement("MSHelp", "link", "http://msdn.microsoft.com/mshelp"); writer.WriteAttributeString("keywords", info.Target); writer.WriteAttributeString("tabindex", "0"); break; case ConceptualLinkType.Id: writer.WriteStartElement("a"); writer.WriteAttributeString("href", "ms-xhelp:///?Id=" + info.Target); break; } writer.WriteString(text); writer.WriteEndElement(); writer.Close(); navigator.DeleteSelf(); } }