public override BuildTopicTocInfo Find(string name, bool recursive) { if (_listTopics == null || _listTopics.Count == 0) { return(null); } BuildTopicTocInfo foundTopic = this[name]; if (foundTopic != null) { return(foundTopic); } if (recursive) { for (int i = 0; i < _listTopics.Count; i++) { foundTopic = _listTopics[i].Find(name, recursive); if (foundTopic != null) { break; } } } return(foundTopic); }
/// <summary> /// This reads and sets its state or attributes stored in a <c>XML</c> format /// with the given reader. /// </summary> /// <param name="reader"> /// The reader with which the <c>XML</c> attributes of this object are accessed. /// </param> /// <exception cref="ArgumentNullException"> /// If the <paramref name="reader"/> is <see langword="null"/>. /// </exception> public override void ReadXml(XmlReader reader) { BuildExceptions.NotNull(reader, "reader"); Debug.Assert(reader.NodeType == XmlNodeType.Element); if (reader.NodeType != XmlNodeType.Element) { return; } if (!String.Equals(reader.Name, TagName, StringComparison.OrdinalIgnoreCase)) { Debug.Assert(false, String.Format( "The element name '{0}' does not match the expected '{1}'.", reader.Name, TagName)); return; } if (reader.IsEmptyElement) { return; } this.Clear(); XmlNodeType nodeType = XmlNodeType.None; while (reader.Read()) { nodeType = reader.NodeType; if (nodeType == XmlNodeType.Element && String.Equals( reader.Name, BuildTopicTocInfo.TagName, StringComparison.OrdinalIgnoreCase)) { // Read the top-level topics... string topicId = reader.GetAttribute("id"); string topicFile = reader.GetAttribute("file"); if (!String.IsNullOrEmpty(topicId) && !String.IsNullOrEmpty(topicFile)) { BuildTopicTocInfo topic = new BuildTopicTocInfo( Guid.NewGuid().ToString(), String.Empty, null); topic.ReadXml(reader); this.Add(topic); } } else if (nodeType == XmlNodeType.EndElement) { if (String.Equals(reader.Name, TagName, StringComparison.OrdinalIgnoreCase)) { break; } } } }
public override int IndexOf(BuildTopicTocInfo item) { if (item == null) { return(-1); } if (_listTopics != null && _listTopics.Count != 0) { return(_listTopics.IndexOf(item)); } return(-1); }
public override void Insert(int index, BuildTopicTocInfo item) { if (item == null) { return; } if (_listTopics == null) { _listTopics = new BuildKeyedList <BuildTopicTocInfo>(); } _listTopics.Insert(index, item); }
public override void Add(BuildTopicTocInfo item) { if (item == null) { return; } if (_listTopics == null) { _listTopics = new BuildKeyedList <BuildTopicTocInfo>(); } _listTopics.Add(item); }
private void ReadTopic(XmlReader reader, BuildTopicTocInfo parent) { XmlNodeType nodeType = XmlNodeType.None; while (reader.Read()) { nodeType = reader.NodeType; if (nodeType == XmlNodeType.Element && String.Equals(reader.Name, "topic", StringComparison.OrdinalIgnoreCase)) { string topicId = reader.GetAttribute("id"); string topicFile = reader.GetAttribute("file"); string topicContainer = reader.GetAttribute("project"); if (!String.IsNullOrEmpty(topicId) && !String.IsNullOrEmpty(topicFile)) { BuildTopicTocInfo topic = new BuildTopicTocInfo( topicId, topicFile, parent); topic.Container = topicContainer; if (String.Equals(topicContainer, "_Namespaces", StringComparison.OrdinalIgnoreCase)) { _listNamespaces.Add(topic); } parent.Add(topic); if (!reader.IsEmptyElement) { // Read the sub-topics... this.ReadTopic(reader, topic); } } } else if (nodeType == XmlNodeType.EndElement) { if (String.Equals(reader.Name, BuildTopicTocInfo.TagName, StringComparison.OrdinalIgnoreCase)) { break; } } } }
public override void Remove(BuildTopicTocInfo item) { if (item == null) { return; } if (_listTopics == null || _listTopics.Count == 0) { return; } if (!_listTopics.Remove(item)) { BuildTopicTocInfo parent = item.Parent; if (parent != null) { parent.Remove(item); } } }
public override void Replace(BuildTopicTocInfo itemOut, BuildTopicTocInfo itemIn) { if (itemIn == null || itemOut == null || _listTopics == null) { return; } int index = this.IndexOf(itemOut); if (index < 0) { BuildTopicTocInfo itemParent = itemOut.Parent; if (itemParent != null) { itemParent.Replace(itemOut, itemIn); } return; } _listTopics.RemoveAt(index); _listTopics.Insert(index, itemIn); }
private void RemoveMarker(ConceptualGroupTocInfo groupTocInfo, ConceptualMarkerTopic markerTopic, BuildContext context) { BuildTopicTocInfo markerTocInfo = groupTocInfo.Find(markerTopic.TopicId, true); if (markerTocInfo == null) { return; } //groupTocInfo.Remove(markerTocInfo); BuildTopicTocInfo markerParent = markerTocInfo.Parent; if (markerParent != null) { markerParent.Remove(markerTocInfo); } else { groupTocInfo.Remove(markerTocInfo); } }
public override void Replace(BuildTopicTocInfo itemOut, BuildGroupTocInfo groupTocInfo) { if (itemOut == null || groupTocInfo == null || groupTocInfo.Count == 0 || _listTopics == null) { return; } int index = this.IndexOf(itemOut); if (index < 0) { BuildTopicTocInfo itemParent = itemOut.Parent; if (itemParent != null) { itemParent.Replace(itemOut, groupTocInfo); } return; } _listTopics.RemoveAt(index); _listTopics.Insert(index, groupTocInfo.Items); }
private void ProcessMarker(ConceptualGroupTocInfo groupTocInfo, ConceptualMarkerTopic markerTopic, BuildContext context) { BuildTopicTocInfo markerTocInfo = groupTocInfo.Find(markerTopic.TopicId, true); if (markerTocInfo == null) { return; } BuildTocContext tocContext = context.TocContext; BuildGroupTocInfo sourceTocInfo = null; switch (markerTopic.SourceType) { case BuildTocInfoType.Topic: BuildTopicTocInfo topicTocInfo = tocContext[markerTopic.SourceId]; if (topicTocInfo == null) { BuildTopicTocInfo markerParent = markerTocInfo.Parent; if (markerParent != null) { markerParent.Remove(markerTocInfo); } else { groupTocInfo.Remove(markerTocInfo); } } else { groupTocInfo.Replace(markerTocInfo, topicTocInfo); // Now, exclude the topic from being included in // the final merging operation... sourceTocInfo = tocContext.GroupOf(topicTocInfo.Name); if (sourceTocInfo != null) { if (sourceTocInfo.ItemType == BuildTocInfoType.Conceptual) { if (_pendindDelete == null) { _pendindDelete = new List <PendingDeletePair>(); } // For the conceptual group, we make room for // nested markers, and suspend the deletion... _pendindDelete.Add(new PendingDeletePair( topicTocInfo, groupTocInfo)); } else if (sourceTocInfo.ItemType == BuildTocInfoType.Reference) { sourceTocInfo.Remove(topicTocInfo); } } } break; case BuildTocInfoType.Reference: case BuildTocInfoType.Conceptual: sourceTocInfo = tocContext.Items[markerTopic.SourceId]; if (sourceTocInfo == null) { //groupTocInfo.Remove(markerTocInfo); BuildTopicTocInfo markerParent = markerTocInfo.Parent; if (markerParent != null) { markerParent.Remove(markerTocInfo); } else { groupTocInfo.Remove(markerTocInfo); } } else { groupTocInfo.Replace(markerTocInfo, sourceTocInfo); // Now, exclude the source group from being included in // the final merging operation... sourceTocInfo.Exclude = true; TocMerge sourceToc = _listTocMerges[markerTopic.SourceId]; if (sourceToc != null) { sourceToc.IsIncluded = false; } } break; } }
private void CustomMergeToc(BuildTopicTocInfo topicParent, TocItem tocItem) { TocItemSourceType sourceType = tocItem.SourceType; if (sourceType == TocItemSourceType.None) { return; } IBuildNamedList <BuildGroupTocInfo> groupTocItems = _tocContext.Items; BuildGroupTocInfo groupToc = null; BuildTopicTocInfo tocInfo = null; switch (sourceType) { case TocItemSourceType.None: break; case TocItemSourceType.Group: groupToc = groupTocItems[tocItem.SourceId]; Debug.Assert(groupToc != null); break; case TocItemSourceType.Namespace: tocInfo = _tocContext[tocItem.SourceId]; break; case TocItemSourceType.NamespaceRoot: groupToc = groupTocItems[tocItem.SourceId]; Debug.Assert(groupToc != null); if (groupToc != null) { if (groupToc.IsRooted) { tocInfo = groupToc[0]; } else { throw new BuildException( "The specified reference group does not have a root container."); } groupToc = null; } break; case TocItemSourceType.Topic: tocInfo = _tocContext[tocItem.SourceId]; break; } if (groupToc != null) { if (!groupToc.Exclude) { topicParent.AddRange(groupToc.Items); } return; } if (tocInfo == null) { if (_logger != null) { _logger.WriteLine(String.Format( "The TOC topic for the item '{0}' cannot be found.", tocItem.Name), BuildLoggerLevel.Warn); } return; } BuildTopicTocInfo topicToc = null; if (tocItem.SourceRecursive) { topicToc = tocInfo; } else { topicToc = new BuildTopicTocInfo(tocInfo.Name, tocInfo.Source, topicParent); topicToc.Container = tocInfo.Container; } topicParent.Add(topicToc); for (int j = 0; j < tocItem.ItemCount; j++) { this.CustomMergeToc(topicToc, tocItem[j]); } }
private bool CustomMergeToc(string mergedToc, TocContent tocContent) { _tocContext.LoadAll(); IBuildNamedList <BuildGroupTocInfo> groupTocItems = _tocContext.Items; Debug.Assert(groupTocItems != null && groupTocItems.Count != 0); int itemCount = tocContent.Count; List <BuildTopicTocInfo> listToc = new List <BuildTopicTocInfo>(); for (int i = 0; i < itemCount; i++) { TocItem tocItem = tocContent[i]; TocItemSourceType sourceType = tocItem.SourceType; if (sourceType == TocItemSourceType.None) { continue; } BuildGroupTocInfo groupToc = null; BuildTopicTocInfo tocInfo = null; switch (sourceType) { case TocItemSourceType.None: break; case TocItemSourceType.Group: groupToc = groupTocItems[tocItem.SourceId]; Debug.Assert(groupToc != null); break; case TocItemSourceType.Namespace: tocInfo = _tocContext[tocItem.SourceId]; break; case TocItemSourceType.NamespaceRoot: groupToc = groupTocItems[tocItem.SourceId]; Debug.Assert(groupToc != null); if (groupToc != null) { if (groupToc.IsRooted) { tocInfo = groupToc[0]; } else { throw new BuildException( "The specified reference group does not have a root container."); } groupToc = null; } break; case TocItemSourceType.Topic: tocInfo = _tocContext[tocItem.SourceId]; break; } if (groupToc != null) { if (!groupToc.Exclude && groupToc.Count != 0) { listToc.AddRange(groupToc.Items); } continue; } if (tocInfo == null) { if (_logger != null) { _logger.WriteLine(String.Format( "The TOC topic for the item '{0}' cannot be found.", tocItem.Name), BuildLoggerLevel.Warn); } continue; } BuildTopicTocInfo topicToc = null; if (tocItem.SourceRecursive) { topicToc = tocInfo; } else { topicToc = new BuildTopicTocInfo(tocInfo.Name, tocInfo.Source, null); topicToc.Container = tocInfo.Container; } listToc.Add(topicToc); for (int j = 0; j < tocItem.ItemCount; j++) { this.CustomMergeToc(topicToc, tocItem[j]); } } if (listToc.Count == 0) { if (_logger != null) { _logger.WriteLine("The custom merging of the table of contents failed.", BuildLoggerLevel.Error); } return(false); } XmlWriter xmlWriter = null; try { XmlWriterSettings writerSettings = new XmlWriterSettings(); writerSettings.Indent = true; writerSettings.OmitXmlDeclaration = false; xmlWriter = XmlWriter.Create(mergedToc, writerSettings); xmlWriter.WriteStartElement("topics"); for (int i = 0; i < listToc.Count; i++) { listToc[i].WriteXml(xmlWriter); } xmlWriter.WriteEndElement(); xmlWriter.Close(); xmlWriter = null; return(true); } catch (Exception ex) { if (xmlWriter != null) { xmlWriter.Close(); xmlWriter = null; } if (_logger != null) { _logger.WriteLine(ex); } return(false); } }
public PendingDeletePair(BuildTopicTocInfo topic, BuildGroupTocInfo group) { _topic = topic; _group = group; }