示例#1
0
        public ActionResult Index()
        {
            List <Book> books = new List <Book>(db.Books);

            string sorting = Request.Cookies["sorting"]?.Value ?? String.Empty;

            if (sorting.Equals("byName"))
            {
                TitleComparer titleComparer = new TitleComparer();
                books.Sort(titleComparer);
            }
            else if (sorting.Equals("byYear"))
            {
                YearComparer yearComparer = new YearComparer();
                books.Sort(yearComparer);
            }

            ViewBag.Books = books;

            return(View());
        }
示例#2
0
        public int Compare(Citation x, Citation y)
        {
            /*
             *                  This is an example of a custom sort macro that sorts all references of type 'internet document' on top of the bibliography.
             *                  The internet documents themselves are sorted according to a different logic than the rest of the cited documents.
             *                  Return values:
             *                  0:               x is considered the same as y sorting-wise, so we cannot tell a difference based on the algorithm below
             *                  > 0 (positive):      x should go after y, x is greater than y
             *                  < 0 (negative):      x should go before y, x is less than
             */


            if (x == null || y == null)
            {
                return(0);
            }

            Reference xReference = x.Reference;
            Reference yReference = y.Reference;

            if (xReference == null || yReference == null)
            {
                return(0);
            }

            ReferenceType xReferenceType = xReference.ReferenceType;
            ReferenceType yReferenceType = yReference.ReferenceType;

            BibliographyCitation xBibliographyCitation = x as BibliographyCitation;
            BibliographyCitation yBibliographyCitation = y as BibliographyCitation;

            if (xBibliographyCitation == null || yBibliographyCitation == null)
            {
                return(0);
            }


            Template xTemplate = x.GetTemplateForCitation();
            Template yTemplate = y.GetTemplateForCitation();

            if (xTemplate == null || yTemplate == null)
            {
                return(0);
            }

            PersonFieldElement xPersonFieldElement = xTemplate.StructuralPersonFieldElement;
            PersonFieldElement yPersonFieldElement = yTemplate.StructuralPersonFieldElement;

            IEnumerable <Person> xPersons = xPersonFieldElement != null?xPersonFieldElement.GetPersonsCited(x) : Enumerable.Empty <Person>();

            IEnumerable <Person> yPersons = yPersonFieldElement != null?yPersonFieldElement.GetPersonsCited(y) : Enumerable.Empty <Person>();

            int xPersonsCount = 0;
            int yPersonsCount = 0;

            if (xPersons != null)
            {
                xPersonsCount = xPersons.Count();
            }
            if (yPersons != null)
            {
                yPersonsCount = yPersons.Count();
            }

            string xTitleForSorting = GetTitleForSorting(xReference);
            string yTitleForSorting = GetTitleForSorting(yReference);

            string xVolume = xReference.Volume;
            string yVolume = yReference.Volume;

            string xSeriesTitleForSorting = GetSeriesTitleForSorting(xReference);
            string ySeriesTitleForSorting = GetSeriesTitleForSorting(yReference);

            string xNumber = xReference.Number;
            string yNumber = yReference.Number;

            StringComparer defaultStringComparer     = StringComparer.Create(_cultureForSorting, true);
            int            personsCompareResult      = 0;
            int            personsCountCompareResult = 0;
            int            titleCompareResult        = 0;
            int            seriesTitleCompareResult  = 0;
            int            volumeCompareResult       = 0;
            int            numberCompareResult       = 0;
            int            yearCompareResult         = 0;
            int            editionCompareResult      = 0;


            if (xPersonsCount == 0 && yPersonsCount == 0)
            {
                //compare Titles
                titleCompareResult = xTitleForSorting.CompareTo(yTitleForSorting);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }

                seriesTitleCompareResult = xSeriesTitleForSorting.CompareTo(ySeriesTitleForSorting);
                if (seriesTitleCompareResult != 0)
                {
                    return(seriesTitleCompareResult);
                }
            }
            else if (xPersonsCount == 0 && yPersonsCount > 0)
            {
                //compare xTitle with yFirstAuthor
                titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yPersons.ElementAt(0).FullName);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }
            }
            else if (xPersonsCount > 0 && yPersonsCount == 0)
            {
                //compare xFirstAuthor with yTitle
                titleCompareResult = defaultStringComparer.Compare(xPersons.ElementAt(0).FullName, yTitleForSorting);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }
            }
            else
            {
                /*
                 *              1. Single Author Group
                 *              2. Author + Single Co-Author Group
                 *              3. Author + Multiple-Co-Authors Group
                 */

                //compare by first author
                personsCompareResult = ComparePersons(xPersons.ElementAt(0), yPersons.ElementAt(0));
                if (personsCompareResult != 0)
                {
                    return(personsCompareResult);
                }

                //still here? then both have same first author
                if ((xPersonsCount == 1 && yPersonsCount > 1) || (xPersonsCount == 2 && yPersonsCount > 2))
                {
                    //x before y
                    return(-1);
                }
                if ((xPersonsCount > 1 && yPersonsCount == 1) || (xPersonsCount > 2 && yPersonsCount == 2))
                {
                    //x after y
                    return(1);
                }
                if (xPersonsCount == 2 && yPersonsCount == 2)
                {
                    //compare by co-author
                    personsCompareResult = ComparePersons(xPersons.ElementAt(1), yPersons.ElementAt(1));
                    if (personsCompareResult != 0)
                    {
                        return(personsCompareResult);
                    }
                }

                //still here?
                //both have either exactly one identical author OR
                //both have exactly two identical authors OR
                //more than 2 authors with identical first author

                //we continue with year comparison
            }


            #region Year

            yearCompareResult = YearComparer.Compare(x, y);
            if (yearCompareResult != 0)
            {
                return(yearCompareResult);
            }

            #endregion Year

            #region Title

            titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yTitleForSorting);
            if (titleCompareResult != 0)
            {
                return(titleCompareResult);
            }


            #endregion Title

            #region Volume

            if
            (
                xReferenceType == yReferenceType &&
                xReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) &&
                yReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) &&
                HasFieldElement(xTemplate, ReferencePropertyId.Volume) &&
                HasFieldElement(yTemplate, ReferencePropertyId.Volume)
            )
            {
                NumberStringComparer volumeComparer = new NumberStringComparer()
                {
                    CompareMode            = NumberStringCompareMode.ByTextAndNumbersSegmentwise,
                    UseAbsoluteNumbersOnly = true
                };

                volumeCompareResult = volumeComparer.Compare(xVolume, yVolume);
                if (volumeCompareResult != 0)
                {
                    return(volumeCompareResult);
                }
            }

            #endregion Volume

            #region Number

            if
            (
                xReferenceType == yReferenceType &&
                xReference.HasCoreField(ReferenceTypeCoreFieldId.Number) &&
                yReference.HasCoreField(ReferenceTypeCoreFieldId.Number) &&
                HasFieldElement(xTemplate, ReferencePropertyId.Number) &&
                HasFieldElement(yTemplate, ReferencePropertyId.Number)
            )
            {
                NumberStringComparer numberComparer = new NumberStringComparer()
                {
                    CompareMode            = NumberStringCompareMode.ByTextAndNumbersSegmentwise,
                    UseAbsoluteNumbersOnly = true
                };

                numberCompareResult = numberComparer.Compare(xNumber, yNumber);
                if (numberCompareResult != 0)
                {
                    return(numberCompareResult);
                }
            }

            #endregion

            #region Edition

            if
            (
                xReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) &&
                yReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) &&
                HasFieldElement(xTemplate, ReferencePropertyId.Edition) &&
                HasFieldElement(yTemplate, ReferencePropertyId.Edition)
            )
            {
                var xEdition = xReference.EditionNumberResolved;
                var yEdition = yReference.EditionNumberResolved;

                bool xHasEdition = !string.IsNullOrEmpty(xEdition);
                bool yHasEdition = !string.IsNullOrEmpty(yEdition);


                if (xHasEdition && yHasEdition)
                {
                    NumberStringComparer editionComparer = new NumberStringComparer()
                    {
                        CompareMode            = NumberStringCompareMode.ByTextAndNumbersSegmentwise,
                        UseAbsoluteNumbersOnly = true
                    };

                    editionCompareResult = editionComparer.Compare(xEdition, yEdition);
                    if (editionCompareResult != 0)
                    {
                        return(editionCompareResult);
                    }
                }
                else if (xHasEdition && !yHasEdition) //y before x
                {
                    return(1);
                }
                else if (!xHasEdition && yHasEdition) //x before y
                {
                    return(-1);
                }
            }

            #endregion

            return(0);
        }
示例#3
0
        public int Compare(Citation x, Citation y)
        {
            /*
             *                  This is an example of a custom sort macro that sorts all references of type 'internet document' on top of the bibliography.
             *                  The internet documents themselves are sorted according to a different logic than the rest of the cited documents.
             *                  Return values:
             *                  0:					x is considered the same as y sorting-wise, so we cannot tell a difference based on the algorithm below
             *                  > 0 (positive):		x should go after y, x is greater than y
             *                  < 0 (negative):		x should go before y, x is less than
             */


            if (x == null || y == null)
            {
                return(0);
            }

            Reference xReference = x.Reference;
            Reference yReference = y.Reference;

            if (xReference == null || yReference == null)
            {
                return(0);
            }

            ReferenceType xReferenceType = xReference.ReferenceType;
            ReferenceType yReferenceType = yReference.ReferenceType;

            var xAuthors = xReference.AuthorsOrEditorsOrOrganizations;
            var yAuthors = yReference.AuthorsOrEditorsOrOrganizations;

            int xAuthorsCount = 0;
            int yAuthorsCount = 0;

            if (xAuthors != null)
            {
                xAuthorsCount = xAuthors.Count;
            }
            if (yAuthors != null)
            {
                yAuthorsCount = yAuthors.Count;
            }

            string xTitleForSorting = GetTitleForSorting(xReference);
            string yTitleForSorting = GetTitleForSorting(yReference);

            string xVolume = xReference.Volume;
            string yVolume = yReference.Volume;

            string xSeriesTitleForSorting = GetSeriesTitleForSorting(xReference);
            string ySeriesTitleForSorting = GetSeriesTitleForSorting(yReference);


            StringComparer defaultStringComparer     = StringComparer.Create(_cultureForSorting, true);
            int            authorCompareResult       = 0;
            int            authorsCountCompareResult = 0;
            int            titleCompareResult        = 0;
            int            seriesTitleCompareResult  = 0;
            int            volumeCompareResult       = 0;
            int            yearCompareResult         = 0;
            int            editionCompareResult      = 0;

            /*
             *                  Die Werke werden in alphabetischer Reihenfolge nach den Familiennamen der Erstautoren bzw. -autorinnen gereiht.
             *                  Ist bei einer Quelle kein Autor bzw. keine Autorin vorhanden, rückt der Titel an die Stelle des Autorennamens und das Werk
             *                  wird nach dem ersten Wort des Titels (wobei bestimmte und unbestimmte Artikel unberücksichtigt bleiben) alphabetisch gereiht.
             */


            if (xAuthorsCount == 0 && yAuthorsCount == 0)
            {
                //compare Titles
                titleCompareResult = xTitleForSorting.CompareTo(yTitleForSorting);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }

                seriesTitleCompareResult = xSeriesTitleForSorting.CompareTo(ySeriesTitleForSorting);
                if (seriesTitleCompareResult != 0)
                {
                    return(seriesTitleCompareResult);
                }
            }
            else if (xAuthorsCount == 0 && yAuthorsCount > 0)
            {
                //compare xTitle with yFirstAuthor
                titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yAuthors.ElementAt(0).FullName);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }
            }
            else if (xAuthorsCount > 0 && yAuthorsCount == 0)
            {
                //compare xFirstAuthor with yTitle
                titleCompareResult = defaultStringComparer.Compare(xAuthors.ElementAt(0).FullName, yTitleForSorting);
                if (titleCompareResult != 0)
                {
                    return(titleCompareResult);
                }
            }
            else
            {
                int minAuthorCount = Math.Min(xAuthorsCount, yAuthorsCount);

                for (int i = 0; i < minAuthorCount; i++)
                {
                    authorCompareResult = CompareAuthors(xAuthors.ElementAt(i), yAuthors.ElementAt(i));
                    if (authorCompareResult != 0)
                    {
                        return(authorCompareResult);
                    }

                    authorsCountCompareResult = xAuthorsCount.CompareTo(yAuthorsCount);
                    if (authorsCountCompareResult != 0)
                    {
                        return(authorsCountCompareResult);
                    }
                }
            }


            /*
             *                  Innerhalb der Gruppe chronologisch aufsteigend
             */
            #region Year

            yearCompareResult = YearComparer.Compare(x, y);
            if (yearCompareResult != 0)
            {
                return(yearCompareResult);
            }

            #endregion Year

            #region Volume

            if
            (
                xReferenceType == yReferenceType &&
                xReference.HasCoreField(ReferenceTypeCoreFieldId.Volume) &&
                yReference.HasCoreField(ReferenceTypeCoreFieldId.Volume)
            )
            {
                NumberStringComparer volumeComparer = new NumberStringComparer()
                {
                    CompareMode            = NumberStringCompareMode.ByTextAndNumbersSegmentwise,
                    UseAbsoluteNumbersOnly = true
                };

                volumeCompareResult = volumeComparer.Compare(xVolume, yVolume);
                if (volumeCompareResult != 0)
                {
                    return(volumeCompareResult);
                }
            }

            #endregion Volume

            #region Title

            titleCompareResult = defaultStringComparer.Compare(xTitleForSorting, yTitleForSorting);
            if (titleCompareResult != 0)
            {
                return(titleCompareResult);
            }


            #endregion Title

            #region Edition

            if
            (
                xReference.HasCoreField(ReferenceTypeCoreFieldId.Edition) &&
                yReference.HasCoreField(ReferenceTypeCoreFieldId.Edition)
            )
            {
                var xEdition = xReference.EditionNumberResolved;
                var yEdition = yReference.EditionNumberResolved;

                bool xHasEdition = !string.IsNullOrEmpty(xEdition);
                bool yHasEdition = !string.IsNullOrEmpty(yEdition);


                if (xHasEdition && yHasEdition)
                {
                    NumberStringComparer editionComparer = new NumberStringComparer()
                    {
                        CompareMode            = NumberStringCompareMode.ByTextAndNumbersSegmentwise,
                        UseAbsoluteNumbersOnly = true
                    };

                    editionCompareResult = editionComparer.Compare(xEdition, yEdition);
                    if (editionCompareResult != 0)
                    {
                        return(editionCompareResult);
                    }
                }
                else if (xHasEdition && !yHasEdition) //y before x
                {
                    return(1);
                }
                else if (!xHasEdition && yHasEdition) //x before y
                {
                    return(-1);
                }
            }

            #endregion

            return(0);
        }