private List <Segment> GetSegments(string completeString) { List <Segment> segments = new List <Segment>(); if (string.IsNullOrEmpty(completeString)) { return(segments); } List <DateTimeMatch> dateTimeMatches = DateTimeInformation.Matches(completeString); if (dateTimeMatches.Count == 0) { segments.Add(new Segment() { text = completeString, type = SegmentType.Text, dateTime = SwissAcademic.Environment.NullDate }); return(segments); } int currentPosition = 0; foreach (DateTimeMatch dateTimeMatch in dateTimeMatches) { int matchPosition = dateTimeMatch.Match.Index; int matchLength = dateTimeMatch.Match.Length; if (matchPosition > currentPosition) { //we add a simple string segment segments.Add(new Segment() { text = completeString.Substring(currentPosition, matchPosition - currentPosition), type = SegmentType.Text, dateTime = SwissAcademic.Environment.NullDate }); currentPosition = matchPosition + matchLength; } //we add the found date string segment segments.Add(new Segment() { text = completeString.Substring(matchPosition, matchLength), type = SegmentType.DateTime, dateTime = dateTimeMatch.DateTime, ContainsDayInformation = !dateTimeMatch.MissingDayWasAutoCompleted, ContainsMonthInformation = !dateTimeMatch.MissingMonthWasAutoCompleted }); currentPosition = matchPosition + matchLength; } if (currentPosition <= completeString.Length - 1) { //we add a remaining string segment segments.Add(new Segment() { text = completeString.Substring(currentPosition, completeString.Length - currentPosition), type = SegmentType.Text, dateTime = SwissAcademic.Environment.NullDate }); } return(segments); }
//Version 2.4 handle missing day or month correctly //Version 2.3 introduction of debug mode //Version 2.2 added parameter 'doNotAbbreviateIfLengthIsEqualToOrLess' to avoid abbreviation of June and July (=4) public IEnumerable <ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled) { bool debugMode = false; //set to true to see, what date Citavi recognized handled = false; if (componentPart == null) { return(null); } if (componentPart.Elements == null || !componentPart.Elements.Any()) { return(null); } if (citation == null || citation.Reference == null) { return(null); } Reference referenceInScope = null; if (componentPart.Scope == ComponentPartScope.Reference) { referenceInScope = citation.Reference; } else if (componentPart.Scope == ComponentPartScope.ParentReference) { referenceInScope = citation.Reference.ParentReference; } if (referenceInScope == null) { return(null); } IEnumerable <DateTimeFieldElement> dateFieldElements = componentPart.Elements.OfType <DateTimeFieldElement>().ToList(); if (dateFieldElements == null || !dateFieldElements.Any()) { return(null); } bool dateFound = false; CultureInfo targetCulture = CultureInfo.CreateSpecificCulture("en-US"); int doNotAbbreviateIfLengthIsEqualToOrLess = 4; //put 4 for most English styles: //3: Jan[uary]=7, Feb[ruary]=8, Mar[ch]=5, Apr[il]=5, May=3, Jun[e]=4, Jul[y]=4, Aug[ust]=6, Sep[tember]=9, Oct[ober]=7, Nov[ember]=8, Dec[ember]=8 //4: Jan[uary]=7, Feb[ruary]=8, Mar[ch]=5, Apr[il]=5, May=3, June=4, July=4, Aug[ust]=6, Sep[tember]=9, Oct[ober]=7, Nov[ember]=8, Dec[ember]=8 foreach (DateTimeFieldElement dateFieldElement in dateFieldElements) { string dateString = referenceInScope.GetValue(dateFieldElement.PropertyId) as string; if (string.IsNullOrEmpty(dateString)) { continue; } List <DateTimeMatch> dateTimeMatches = DateTimeInformation.Matches(dateString); if (!dateTimeMatches.Any() || dateTimeMatches.Count > 1) { continue; } DateTimeMatch dateTimeMatch = dateTimeMatches.ElementAt(0); bool containsDayInformation = !dateTimeMatch.MissingDayWasAutoCompleted; bool containsMonthInformation = !dateTimeMatch.MissingMonthWasAutoCompleted; DateTime dateValue = dateTimeMatch.DateTime; int day = dateValue.Day; int month = dateValue.Month; int year = dateValue.Year; string monthStringShort = dateValue.ToString("MMM", targetCulture); string monthStringLong = dateValue.ToString("MMMM", targetCulture); string monthString = monthStringShort == monthStringLong ? monthStringShort : monthStringLong.Length <= doNotAbbreviateIfLengthIsEqualToOrLess ? monthStringLong : monthStringShort + "."; //string dayString = day.ToString("D2"); //2-digit day, padded with leading 0 if necessary, so 08 instead of 8 string dayString = day.ToString(); string yearString = dateValue.ToString("yyyy"); //4-digit year if (debugMode) { string debugDatePattern = "Original: {0} - Year: {1} Month: {2} Day: {3}"; dateString = string.Format(debugDatePattern, dateString, dateValue.Year, dateValue.Month, dateValue.Day); } else { if (dateTimeMatch.MissingMonthWasAutoCompleted && dateTimeMatch.MissingDayWasAutoCompleted) { string newDatePattern = "{0}"; dateString = string.Format(newDatePattern, yearString); } else if (dateTimeMatch.MissingDayWasAutoCompleted) { string newDatePattern = "{0} {1}"; dateString = string.Format(newDatePattern, monthString, yearString); } else { string newDatePattern = "{0} {1} {2}"; dateString = string.Format(newDatePattern, dayString, monthString, yearString); } } LiteralElement outputDateElement = new LiteralElement(componentPart, dateString); outputDateElement.FontStyle = dateFieldElement.FontStyle; componentPart.Elements.ReplaceItem(dateFieldElement, outputDateElement); dateFound = true; } if (dateFound) { foreach (LiteralElement literalElement in componentPart.Elements.OfType <LiteralElement>()) { literalElement.ApplyCondition = ElementApplyCondition.Always; } } handled = false; return(null); }