Beispiel #1
0
        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);
        }
Beispiel #2
0
        //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);
        }