// instantiation logic public ResolveReferenceLinksComponent2(BuildAssembler assembler, XPathNavigator configuration) : base(assembler, configuration) { // base-url is an xpath expression applied against the current document to pick up the save location of the // document. If specified, local links will be made relative to the base-url. string baseUrlValue = configuration.GetAttribute("base-url", String.Empty); if (!String.IsNullOrEmpty(baseUrlValue)) { baseUrl = XPathExpression.Compile(baseUrlValue); } // url-format is a string format that is used to format the value of local href attributes. The default is // "{0}.htm" for backwards compatibility. string hrefFormatValue = configuration.GetAttribute("href-format", String.Empty); if (!String.IsNullOrEmpty(hrefFormatValue)) { hrefFormat = hrefFormatValue; } // the container XPath can be replaced; this is useful string containerValue = configuration.GetAttribute("container", String.Empty); if (!String.IsNullOrEmpty(containerValue)) { XmlTargetCollectionUtilities.ContainerExpression = containerValue; } targets = new TargetCollection(); resolver = new LinkTextResolver(targets); XPathNodeIterator targets_nodes = configuration.Select("targets"); foreach (XPathNavigator targets_node in targets_nodes) { ProcessTargetsNode(targets_node); } WriteMessage(MessageLevel.Info, String.Format("Loaded {0} reference targets.", targets.Count)); string locale_value = configuration.GetAttribute("locale", String.Empty); if (!String.IsNullOrEmpty(locale_value) && msdn != null) { msdn.Locale = locale_value; } string target_value = configuration.GetAttribute("linkTarget", String.Empty); if (!String.IsNullOrEmpty(target_value)) { linkTarget = target_value; } }
//===================================================================== /// <inheritdoc /> public override void Initialize(XPathNavigator configuration) { TargetDictionary newTargets; ReferenceLinkType type; string attrValue, id; targets = new TargetTypeDictionary(); resolver = new LinkTextResolver(targets); // Get the shared instances dictionary. Create it if it doesn't exist. if (BuildComponentCore.Data.ContainsKey(SharedReferenceTargetsId)) { sharedTargets = BuildComponentCore.Data[SharedReferenceTargetsId] as Dictionary <string, TargetDictionary>; } if (sharedTargets == null) { BuildComponentCore.Data[SharedReferenceTargetsId] = sharedTargets = new Dictionary <string, TargetDictionary>(); } // base-url is an xpath expression applied against the current document to pick up the save location of the // document. If specified, local links will be made relative to the base-url. string baseUrlValue = configuration.GetAttribute("base-url", String.Empty); if (!String.IsNullOrEmpty(baseUrlValue)) { baseUrl = XPathExpression.Compile(baseUrlValue); } // hrefFormat is a string format that is used to format the value of local href attributes. The // default is "{0}.htm" if not specified. hrefFormat = (string)configuration.Evaluate("string(hrefFormat/@value)"); if (String.IsNullOrWhiteSpace(hrefFormat)) { hrefFormat = "{0}.htm"; } // The container XPath can be replaced; this is useful string containerValue = configuration.GetAttribute("container", String.Empty); if (!String.IsNullOrEmpty(containerValue)) { XmlTargetDictionaryUtilities.ContainerExpression = containerValue; } XPathNodeIterator targetsNodes = configuration.Select("targets"); #if DEBUG this.WriteMessage(MessageLevel.Diagnostic, "Loading reference link target info"); DateTime startLoad = DateTime.Now; #endif foreach (XPathNavigator targetsNode in targetsNodes) { // Get target type attrValue = targetsNode.GetAttribute("type", String.Empty); if (String.IsNullOrEmpty(attrValue)) { this.WriteMessage(MessageLevel.Error, "Each targets element must have a type attribute " + "that specifies which type of links to create"); } if (!Enum.TryParse <ReferenceLinkType>(attrValue, true, out type)) { this.WriteMessage(MessageLevel.Error, "'{0}' is not a supported reference link type", attrValue); } // Check for shared instance by ID. If not there, create it and add it. id = targetsNode.GetAttribute("id", String.Empty); if (!sharedTargets.TryGetValue(id, out newTargets)) { this.WriteMessage(MessageLevel.Info, "Loading {0} reference link type targets", type); newTargets = this.CreateTargetDictionary(targetsNode); sharedTargets[newTargets.DictionaryId] = newTargets; } targets.Add(type, newTargets); } #if DEBUG TimeSpan loadTime = (DateTime.Now - startLoad); this.WriteMessage(MessageLevel.Diagnostic, "Load time: {0} seconds", loadTime.TotalSeconds); // Dump targets for comparison to other versions // targets.DumpTargetDictionary(Path.GetFullPath("TargetDictionary.xml")); // Serialization test // targets.SerializeDictionary(Directory.GetCurrentDirectory()); #endif // Getting the count from a database cache can be expensive so only report it if it will be seen if (this.BuildAssembler.VerbosityLevel == MessageLevel.Info) { this.WriteMessage(MessageLevel.Info, "{0} total reference link targets", targets.Count); } if (targets.NeedsMsdnResolver) { this.WriteMessage(MessageLevel.Info, "Creating MSDN URL resolver"); msdnResolver = this.CreateMsdnResolver(configuration); string localeValue = (string)configuration.Evaluate("string(locale/@value)"); if (msdnResolver != null && !String.IsNullOrWhiteSpace(localeValue)) { msdnResolver.Locale = localeValue; } } linkTarget = (string)configuration.Evaluate("string(linkTarget/@value)"); if (String.IsNullOrWhiteSpace(linkTarget)) { linkTarget = "_blank"; } }
//===================================================================== /// <inheritdoc /> public override void Initialize(XPathNavigator configuration) { TargetDictionary newTargets; ReferenceLinkType type; string attrValue, id; targets = new TargetTypeDictionary(); resolver = new LinkTextResolver(targets); // Get the shared instances dictionary. Create it if it doesn't exist. if(BuildComponentCore.Data.ContainsKey(SharedReferenceTargetsId)) sharedTargets = BuildComponentCore.Data[SharedReferenceTargetsId] as Dictionary<string, TargetDictionary>; if(sharedTargets == null) BuildComponentCore.Data[SharedReferenceTargetsId] = sharedTargets = new Dictionary<string, TargetDictionary>(); // base-url is an xpath expression applied against the current document to pick up the save location of the // document. If specified, local links will be made relative to the base-url. string baseUrlValue = configuration.GetAttribute("base-url", String.Empty); if(!String.IsNullOrEmpty(baseUrlValue)) baseUrl = XPathExpression.Compile(baseUrlValue); // hrefFormat is a string format that is used to format the value of local href attributes. The // default is "{0}.htm" if not specified. hrefFormat = (string)configuration.Evaluate("string(hrefFormat/@value)"); if(String.IsNullOrWhiteSpace(hrefFormat)) hrefFormat = "{0}.htm"; // The container XPath can be replaced; this is useful string containerValue = configuration.GetAttribute("container", String.Empty); if(!String.IsNullOrEmpty(containerValue)) XmlTargetDictionaryUtilities.ContainerExpression = containerValue; XPathNodeIterator targetsNodes = configuration.Select("targets"); #if DEBUG base.WriteMessage(MessageLevel.Diagnostic, "Loading reference link target info"); DateTime startLoad = DateTime.Now; #endif foreach(XPathNavigator targetsNode in targetsNodes) { // Get target type attrValue = targetsNode.GetAttribute("type", String.Empty); if(String.IsNullOrEmpty(attrValue)) base.WriteMessage(MessageLevel.Error, "Each targets element must have a type attribute " + "that specifies which type of links to create"); if(!Enum.TryParse<ReferenceLinkType>(attrValue, true, out type)) base.WriteMessage(MessageLevel.Error, "'{0}' is not a supported reference link type", attrValue); // Check for shared instance by ID. If not there, create it and add it. id = targetsNode.GetAttribute("id", String.Empty); if(!sharedTargets.TryGetValue(id, out newTargets)) { this.WriteMessage(MessageLevel.Info, "Loading {0} reference link type targets", type); newTargets = this.CreateTargetDictionary(targetsNode); sharedTargets[newTargets.DictionaryId] = newTargets; } targets.Add(type, newTargets); } #if DEBUG TimeSpan loadTime = (DateTime.Now - startLoad); base.WriteMessage(MessageLevel.Diagnostic, "Load time: {0} seconds", loadTime.TotalSeconds); // Dump targets for comparison to other versions // targets.DumpTargetDictionary(Path.GetFullPath("TargetDictionary.xml")); // Serialization test // targets.SerializeDictionary(Directory.GetCurrentDirectory()); #endif // Getting the count from a database cache can be expensive so only report it if it will be seen if(base.BuildAssembler.VerbosityLevel == MessageLevel.Info) base.WriteMessage(MessageLevel.Info, "{0} total reference link targets", targets.Count); if(targets.NeedsMsdnResolver) { base.WriteMessage(MessageLevel.Info, "Creating MSDN URL resolver"); msdnResolver = this.CreateMsdnResolver(configuration); string localeValue = (string)configuration.Evaluate("string(locale/@value)"); if(msdnResolver != null && !String.IsNullOrWhiteSpace(localeValue)) msdnResolver.Locale = localeValue; } linkTarget = (string)configuration.Evaluate("string(linkTarget/@value)"); if(String.IsNullOrWhiteSpace(linkTarget)) linkTarget = "_blank"; }
// instantiation logic public ResolveReferenceLinksComponent2(BuildAssembler assembler, XPathNavigator configuration) : base(assembler, configuration) { // base-url is an xpath expression applied against the current document to pick up the save location of the // document. If specified, local links will be made relative to the base-url. string baseUrlValue = configuration.GetAttribute("base-url", String.Empty); if (!String.IsNullOrEmpty(baseUrlValue)) { baseUrl = XPathExpression.Compile(baseUrlValue); } // url-format is a string format that is used to format the value of local href attributes. The default is // "{0}.htm" for backwards compatibility. string hrefFormatValue = configuration.GetAttribute("href-format", String.Empty); if (!String.IsNullOrEmpty(hrefFormatValue)) { hrefFormat = hrefFormatValue; } // the container XPath can be replaced; this is useful string containerValue = configuration.GetAttribute("container", String.Empty); if (!String.IsNullOrEmpty(containerValue)) { XmlTargetCollectionUtilities.ContainerExpression = containerValue; } targets = new TargetCollection(); resolver = new LinkTextResolver(targets); XPathNodeIterator targets_nodes = configuration.Select("targets"); foreach (XPathNavigator targets_node in targets_nodes) { // get target type string typeValue = targets_node.GetAttribute("type", String.Empty); if (String.IsNullOrEmpty(typeValue)) { WriteMessage(MessageLevel.Error, "Each targets element must have a type attribute that specifies which type of links to create."); } LinkType2 type = LinkType2.None; try { type = (LinkType2)Enum.Parse(typeof(LinkType2), typeValue, true); if ((type == LinkType2.Msdn) && (msdn == null)) { WriteMessage(MessageLevel.Info, "Creating MSDN URL resolver."); msdn = new MsdnResolver(); } } catch (ArgumentException) { WriteMessage(MessageLevel.Error, String.Format("'{0}' is not a supported reference link type.", typeValue)); } // get base directory string baseValue = targets_node.GetAttribute("base", String.Empty); // get file pattern string filesValue = targets_node.GetAttribute("files", String.Empty); if (String.IsNullOrEmpty(filesValue)) { WriteMessage(MessageLevel.Error, "Each targets element must have a files attribute specifying which target files to load."); } // determine whether to search recursively bool recurse = false; string recurseValue = targets_node.GetAttribute("recurse", String.Empty); if (!String.IsNullOrEmpty(recurseValue)) { if (String.Compare(recurseValue, Boolean.TrueString, true) == 0) { recurse = true; } else if (String.Compare(recurseValue, Boolean.FalseString, true) == 0) { recurse = false; } else { WriteMessage(MessageLevel.Error, String.Format("On the targets element, recurse='{0}' is not an allowed value.", recurseValue)); } } // turn baseValue and filesValue into directoryPath and filePattern string fullPath; if (String.IsNullOrEmpty(baseValue)) { fullPath = filesValue; } else { fullPath = Path.Combine(baseValue, filesValue); } fullPath = Environment.ExpandEnvironmentVariables(fullPath); string directoryPath = Path.GetDirectoryName(fullPath); if (String.IsNullOrEmpty(directoryPath)) { directoryPath = Environment.CurrentDirectory; } string filePattern = Path.GetFileName(fullPath); // verify that directory exists if (!Directory.Exists(directoryPath)) { WriteMessage(MessageLevel.Error, String.Format("The targets directory '{0}' does not exist.", directoryPath)); } // add the specified targets from the directory WriteMessage(MessageLevel.Info, String.Format("Searching directory '{0}' for targets files of the form '{1}'.", directoryPath, filePattern)); AddTargets(directoryPath, filePattern, recurse, type); } WriteMessage(MessageLevel.Info, String.Format("Loaded {0} reference targets.", targets.Count)); string locale_value = configuration.GetAttribute("locale", String.Empty); if (!String.IsNullOrEmpty(locale_value) && msdn != null) { msdn.Locale = locale_value; } string target_value = configuration.GetAttribute("linkTarget", String.Empty); if (!String.IsNullOrEmpty(target_value)) { linkTarget = target_value; } }