예제 #1
0
        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);
        }
예제 #2
0
 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);
        }
예제 #4
0
        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);
 }
예제 #6
0
        /// <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();
            }
        }