private void update_iterator() { switch (_axis) { case Type.PARENT: _iterator = new ParentAxis(); break; case Type.ANCESTOR: _iterator = new AncestorAxis(); break; case Type.PRECEDING_SIBLING: _iterator = new PrecedingSiblingAxis(); break; case Type.PRECEDING: _iterator = new PrecedingAxis(); break; case Type.ANCESTOR_OR_SELF: _iterator = new AncestorOrSelfAxis(); break; case Type.DOTDOT: _iterator = null; break; default: Debug.Assert(false); break; } }
private static void InitializeListItemRetrieverForStory(XDocument numXDoc, XDocument stylesXDoc, XElement rootNode) { var paragraphs = rootNode .DescendantsTrimmed(W.txbxContent) .Where(p => p.Name == W.p); foreach (var paragraph in paragraphs) { InitListItemInfo(numXDoc, stylesXDoc, paragraph); } var abstractNumIds = paragraphs .Select(paragraph => { ListItemInfo listItemInfo = paragraph.Annotation <ListItemInfo>(); if (!listItemInfo.IsListItem) { return((int?)null); } return(listItemInfo.AbstractNumId); }) .Where(a => a != null) .Distinct() .ToList(); // when debugging, it is sometimes useful to cause processing of a specific abstractNumId first. // the following code enables this. //int? abstractIdToProcessFirst = null; //if (abstractIdToProcessFirst != null) //{ // abstractNumIds = (new[] { abstractIdToProcessFirst }) // .Concat(abstractNumIds.Where(ani => ani != abstractIdToProcessFirst)) // .ToList(); //} foreach (var abstractNumId in abstractNumIds) { var listItems = paragraphs .Where(paragraph => { var listItemInfo = paragraph.Annotation <ListItemInfo>(); if (!listItemInfo.IsListItem) { return(false); } return(listItemInfo.AbstractNumId == abstractNumId); }) .ToList(); // annotate paragraphs with previous paragraphs so that we can look backwards with good perf XElement prevParagraph = null; foreach (var paragraph in listItems) { ReverseAxis reverse = new ReverseAxis() { PreviousParagraph = prevParagraph, }; paragraph.AddAnnotation(reverse); prevParagraph = paragraph; } var startOverrideAlreadyUsed = new List <int>(); List <int> previous = null; ListItemInfo[] listItemInfoInEffectForStartOverride = new ListItemInfo[] { null, null, null, null, null, null, null, null, null, null, }; foreach (var paragraph in listItems) { var listItemInfo = paragraph.Annotation <ListItemInfo>(); var ilvl = GetParagraphLevel(paragraph); listItemInfoInEffectForStartOverride[ilvl] = listItemInfo; ListItemInfo listItemInfoInEffect = null; if (ilvl > 0) { listItemInfoInEffect = listItemInfoInEffectForStartOverride[ilvl - 1]; } var levelNumbers = new List <int>(); for (int level = 0; level <= ilvl; level++) { var numId = listItemInfo.NumId; var startOverride = listItemInfo.StartOverride(level); int?inEffectStartOverride = null; if (listItemInfoInEffect != null) { inEffectStartOverride = listItemInfoInEffect.StartOverride(level); } if (level == ilvl) { var lvl = listItemInfo.Lvl(ilvl); var lvlRestart = (int?)lvl.Elements(W.lvlRestart).Attributes(W.val).FirstOrDefault(); if (lvlRestart != null) { var previousPara = PreviousParagraphsForLvlRestart(paragraph, (int)lvlRestart) .FirstOrDefault(p => { var plvl = GetParagraphLevel(p); return(plvl == ilvl); }); if (previousPara != null) { previous = previousPara.Annotation <LevelNumbers>().LevelNumbersArray.ToList(); } } } if (previous == null || level >= previous.Count() || (level == ilvl && startOverride != null && !startOverrideAlreadyUsed.Contains(numId))) { if (previous == null || level >= previous.Count()) { var start = listItemInfo.Start(level); // only look at startOverride if the level that we're examining is same as the paragraph's level. if (level == ilvl) { if (startOverride != null && !startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); start = (int)startOverride; } else { if (startOverride != null) { start = (int)startOverride; } if (inEffectStartOverride != null && inEffectStartOverride > start) { start = (int)inEffectStartOverride; } } } levelNumbers.Add(start); } else { var start = listItemInfo.Start(level); // only look at startOverride if the level that we're examining is same as the paragraph's level. if (level == ilvl) { if (startOverride != null) { if (!startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); start = (int)startOverride; } } } levelNumbers.Add(start); } } else { int?thisNumber = null; if (level == ilvl) { if (startOverride != null) { if (!startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); thisNumber = (int)startOverride; } thisNumber = previous.ElementAt(level) + 1; } else { thisNumber = previous.ElementAt(level) + 1; } } else { thisNumber = previous.ElementAt(level); } levelNumbers.Add((int)thisNumber); } } var levelNumbersAnno = new LevelNumbers() { LevelNumbersArray = levelNumbers.ToArray() }; paragraph.AddAnnotation(levelNumbersAnno); previous = levelNumbers; } } }
private static void InitializeListItemRetrieverForStory(XDocument numXDoc, XDocument stylesXDoc, XElement rootNode) { var paragraphs = rootNode .DescendantsTrimmed(W.txbxContent) .Where(p => p.Name == W.p); foreach (var paragraph in paragraphs) InitListItemInfo(numXDoc, stylesXDoc, paragraph); var abstractNumIds = paragraphs .Select(paragraph => { ListItemInfo listItemInfo = paragraph.Annotation<ListItemInfo>(); if (!listItemInfo.IsListItem) return (int?)null; return listItemInfo.AbstractNumId; }) .Where(a => a != null) .Distinct() .ToList(); // when debugging, it is sometimes useful to cause processing of a specific abstractNumId first. // the following code enables this. //int? abstractIdToProcessFirst = null; //if (abstractIdToProcessFirst != null) //{ // abstractNumIds = (new[] { abstractIdToProcessFirst }) // .Concat(abstractNumIds.Where(ani => ani != abstractIdToProcessFirst)) // .ToList(); //} foreach (var abstractNumId in abstractNumIds) { var listItems = paragraphs .Where(paragraph => { var listItemInfo = paragraph.Annotation<ListItemInfo>(); if (!listItemInfo.IsListItem) return false; return listItemInfo.AbstractNumId == abstractNumId; }) .ToList(); // annotate paragraphs with previous paragraphs so that we can look backwards with good perf XElement prevParagraph = null; foreach (var paragraph in listItems) { ReverseAxis reverse = new ReverseAxis() { PreviousParagraph = prevParagraph, }; paragraph.AddAnnotation(reverse); prevParagraph = paragraph; } var startOverrideAlreadyUsed = new List<int>(); List<int> previous = null; ListItemInfo[] listItemInfoInEffectForStartOverride = new ListItemInfo[] { null, null, null, null, null, null, null, null, null, null, }; foreach (var paragraph in listItems) { var listItemInfo = paragraph.Annotation<ListItemInfo>(); var ilvl = GetParagraphLevel(paragraph); listItemInfoInEffectForStartOverride[ilvl] = listItemInfo; ListItemInfo listItemInfoInEffect = null; if (ilvl > 0) listItemInfoInEffect = listItemInfoInEffectForStartOverride[ilvl - 1]; var levelNumbers = new List<int>(); for (int level = 0; level <= ilvl; level++) { var numId = listItemInfo.NumId; var startOverride = listItemInfo.StartOverride(level); int? inEffectStartOverride = null; if (listItemInfoInEffect != null) inEffectStartOverride = listItemInfoInEffect.StartOverride(level); if (level == ilvl) { var lvl = listItemInfo.Lvl(ilvl); var lvlRestart = (int?)lvl.Elements(W.lvlRestart).Attributes(W.val).FirstOrDefault(); if (lvlRestart != null) { var previousPara = PreviousParagraphsForLvlRestart(paragraph, (int)lvlRestart) .FirstOrDefault(p => { var plvl = GetParagraphLevel(p); return plvl == ilvl; }); if (previousPara != null) previous = previousPara.Annotation<LevelNumbers>().LevelNumbersArray.ToList(); } } if (previous == null || level >= previous.Count() || (level == ilvl && startOverride != null && !startOverrideAlreadyUsed.Contains(numId))) { if (previous == null || level >= previous.Count()) { var start = listItemInfo.Start(level); // only look at startOverride if the level that we're examining is same as the paragraph's level. if (level == ilvl) { if (startOverride != null && !startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); start = (int)startOverride; } else { if (startOverride != null) start = (int)startOverride; if (inEffectStartOverride != null && inEffectStartOverride > start) start = (int)inEffectStartOverride; } } levelNumbers.Add(start); } else { var start = listItemInfo.Start(level); // only look at startOverride if the level that we're examining is same as the paragraph's level. if (level == ilvl) { if (startOverride != null) { if (!startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); start = (int)startOverride; } } } levelNumbers.Add(start); } } else { int? thisNumber = null; if (level == ilvl) { if (startOverride != null) { if (!startOverrideAlreadyUsed.Contains(numId)) { startOverrideAlreadyUsed.Add(numId); thisNumber = (int)startOverride; } thisNumber = previous.ElementAt(level) + 1; } else { thisNumber = previous.ElementAt(level) + 1; } } else { thisNumber = previous.ElementAt(level); } levelNumbers.Add((int)thisNumber); } } var levelNumbersAnno = new LevelNumbers() { LevelNumbersArray = levelNumbers.ToArray() }; paragraph.AddAnnotation(levelNumbersAnno); previous = levelNumbers; } } }