/// <summary> /// Determines the state of a guideline. If a bookmark already exists for it than the ref bookmarkKey is set to its id. /// </summary> private static GuidelineStatus checkBookmarkStatus(string text, Range individualGuidelineRange, ref string bookmarkKey) { var bookmarksEnumerator = individualGuidelineRange.Bookmarks.GetEnumerator(); int guidelineStatus = 0; if (!bookmarksEnumerator.MoveNext()) { return((GuidelineStatus)guidelineStatus); } else //get bookmark ID { guidelineStatus++; var bookmark = (Word.Bookmark)bookmarksEnumerator.Current; bookmarkKey = bookmark.Name; var currentDocumentGuideline = new Guideline(); currentDocumentGuideline.Key = bookmarkKey; Guideline existingGuideLine; if (GuidelinesFormatter.Guidelines.TryGetValue(currentDocumentGuideline, out existingGuideLine)) { //check if text has changed. int distance = GuidelineTextCompare.Levenshtein(individualGuidelineRange.Text, existingGuideLine.Text); if (distance > 2) { guidelineStatus++; } } //find that bookmark key's guideline text from the previous set of guidelines. compare to current text. //guidelineStatus++; return((GuidelineStatus)guidelineStatus); //return false; } }
private HashSet <Guideline> ReadExisitingGuidelinesFile(string pathToExistingGuidelinesXml) { XDocument previousGuidelines = XDocument.Load(pathToExistingGuidelinesXml); HashSet <Guideline> guidelines = new HashSet <Guideline>(); foreach (var guidelineFromXml in previousGuidelines.Root.DescendantNodes().OfType <XElement>()) { Guideline guideline = new Guideline(); guideline.Severity = guidelineFromXml.Attribute(_Severity)?.Value; guideline.Subsection = guidelineFromXml.Attribute(_Subsection)?.Value; guideline.Section = guidelineFromXml.Attribute(_Section)?.Value; guideline.Text = guidelineFromXml?.Value; guideline.Key = guidelineFromXml.Attribute(_Key)?.Value; guidelines.Add(guideline); } return(guidelines); }
/// <summary> /// Bookmarks each individal guideline in the Guideline table. e.g. Ch1_123asd8ad /// </summary> private static void ParseIndividualGuidelinesInTable(Range tableRange, ref List <Guideline> guidelines, int chapterNumber, ExtractionMode extractionMode) { string guidAsString; string tableText = tableRange.Text; MatchCollection guidelineMatches; if (!string.IsNullOrEmpty(tableText)) { guidelineMatches = Regex.Matches(tableText, @"(([^\\](?<!\r))*(?=(\r)))"); //text followed by carriage return -> get each individual guideline (i.e. each DO..., DONT... etc) in the the table } else { return; } object start = tableRange.Start; object end = tableRange.End; Word.Range individualGuidelineRange; foreach (Match guidelineMatch in guidelineMatches) { if (guidelineMatch.Value.StartsWith("Guideline") || string.IsNullOrWhiteSpace(guidelineMatch.Value)) { continue; //skip the first line and whitespace matches } individualGuidelineRange = _ChapterWordDoc.Range(start, end); string searchText = PrepareFindText(guidelineMatch.Value); individualGuidelineRange.Find.Text = searchText; individualGuidelineRange.Find.Execute(); if (individualGuidelineRange.Find.Found) { guidAsString = Guid.NewGuid().ToString("N"); string bookmarkKey = "NA"; string guidelineText = GetXmlCompatibleText(individualGuidelineRange.Text); Guideline guideline; switch (extractionMode) { case ExtractionMode.BookmarkAllGuidelines: bookmarkKey = (_ChapterWordDoc.Bookmarks.Add(($"Ch{chapterNumber.ToString().PadLeft(2, '0')}_{guidAsString}").Substring(0, 12), individualGuidelineRange).Name); guideline = new Guideline() { Key = bookmarkKey, Text = guidelineText }; GuidelinesFormatter.Guidelines.Add(guideline); break; case ExtractionMode.NoBookmarking: bookmarkKey = "NA"; guideline = new Guideline() { Key = bookmarkKey, Text = guidelineText }; GuidelinesFormatter.Guidelines.Add(guideline); break; case ExtractionMode.BookmarkOnlyNewGuidelinesAndCheckForChangesOfPreviouslyBookmarkedGuidelines: //check if text is already bookmarked and if text has changed. GuidelineStatus guidelineStatus = checkBookmarkStatus(individualGuidelineRange.Text, individualGuidelineRange, ref bookmarkKey); if (guidelineStatus == GuidelineStatus.NotPreviouslyBookmarkedNewGuideline) { bookmarkKey = (_ChapterWordDoc.Bookmarks.Add(($"Ch{chapterNumber.ToString().PadLeft(2, '0')}_{guidAsString}").Substring(0, 12), individualGuidelineRange).Name); guideline = new Guideline() { Key = bookmarkKey, Text = guidelineText }; GuidelinesFormatter.Guidelines.Add(guideline); } else if (guidelineStatus == GuidelineStatus.BookmarkedAndChanged) { Guideline existingGuideLine; Guideline guidelineWithChangedText = new Guideline() { Key = bookmarkKey }; if (GuidelinesFormatter.Guidelines.TryGetValue(guidelineWithChangedText, out existingGuideLine)) { GuidelinesFormatter.Guidelines.Remove(guidelineWithChangedText); //remove old guideline = new Guideline() { Key = bookmarkKey, Text = guidelineText, Comments = existingGuideLine.Comments, Section = existingGuideLine.Section, Severity = existingGuideLine.Severity, Subsection = existingGuideLine.Subsection }; //update new GuidelinesFormatter.Guidelines.Add(guideline); } } break; } //guidelines.Add((bookmark, individualGuidelineRange.Text)); //GuidelinesFormatter.Guidelines.Add(guideline); //guidelines.Add(guideline); } } }
public override bool Equals(object obj) { Guideline otherGuideline = obj as Guideline; return(otherGuideline != null && string.Equals(otherGuideline.Key, this.Key)); }