예제 #1
0
        public static List<BookmarkBinding> AlignInRange(BookmarkBinding bm1, BookmarkBinding bm2)
        {
            var bindings = new List<BookmarkBinding>();

            List<Bookmark> marks1 = bm1.Bookmark1.InBook.Bookmarks
                .Where(b => b.Order > bm1.Bookmark1.Order & b.Order < bm2.Bookmark1.Order).OrderBy(b => b.Order).ToList();

            List<Bookmark> marks2 = bm1.Bookmark2.InBook.Bookmarks
                .Where(b => b.Order > bm1.Bookmark2.Order & b.Order < bm2.Bookmark2.Order).OrderBy(b => b.Order).ToList();

            int count = 0;
            foreach (var b1 in marks1)
            {
                if (count >= marks1.Count || count >= marks2.Count) break;
                var b2 = marks2.ElementAt(count);
                BookmarkBinding bm = new BookmarkBinding()
                {
                    Bookmark1 = b1,
                    Bookmark2 = b2,
                    Type = 0
                };
                bindings.Add(bm);
                count++;
            }

            return bindings;
        }
예제 #2
0
        public JsonResult CreateBookmarkBinding(int book1, int book2, string id1, string id2 = null)
        {
            BookmarkBinding mark = new BookmarkBinding()
            {
                BookId1 = book1,
                BookId2 = book2,
                BookmarkId1 = id1,
                BookmarkId2 = id2
            };

            db.BookmarkBindings.Add(mark);
            db.SaveChanges();

            return Json(mark, JsonRequestBehavior.AllowGet);
        }
예제 #3
0
        public static List<BookmarkBinding> AlignByChapters(TwinBook tb)
        {
            Book book1 = tb.Book1;
            Book book2 = tb.Book2;
            string path = tb.Path;
            HtmlDocument doc = new HtmlDocument();
            doc.Load(System.Web.Hosting.HostingEnvironment.MapPath(path));
            var left = doc.DocumentNode.SelectSingleNode("//body//*[@class='left-twin']");
            var right = doc.DocumentNode.SelectSingleNode("//body//*[@class='right-twin']");

            var bindings = new List<BookmarkBinding>();

            int count = 0;
            var chapters2 = SelectChapters(right);
            foreach (HtmlNode chapter1 in SelectChapters(left))
            {
                var raw = AlignChunks(chapter1.InnerHtml, chapters2.ElementAt(count).InnerHtml);

                foreach (var b in raw)
                {
                    Bookmark bm1 = book1.Bookmarks.Single(r => r.BookmarkId == b.Bookmark1.BookmarkId);
                    Bookmark bm2 = book2.Bookmarks.Single(r => r.BookmarkId == b.Bookmark2.BookmarkId);
                    BookmarkBinding bm = new BookmarkBinding()
                    {
                        Bookmark1 = bm1,
                        Bookmark2 = bm2,
                        Type = 0
                    };
                    bindings.Add(bm);

                }
                count++;
            }

            return bindings;
        }
예제 #4
0
        private static List<BookmarkBinding> AlignChunks(string chunk1, string chunk2)
        {
            var alignments = new List<BookmarkBinding>();

            HtmlDocument doc1 = new HtmlDocument();
            doc1.LoadHtml(chunk1);
            HtmlDocument doc2 = new HtmlDocument();
            doc2.LoadHtml(chunk2);

            HtmlNodeCollection sentences1 = SelectSentences(doc1.DocumentNode);
            HtmlNodeCollection sentences2 = SelectSentences(doc2.DocumentNode);

            int count = 0;
            foreach (HtmlNode s in sentences1)
            {
                if (sentences2.Count <= count) break;
                var bm = new BookmarkBinding
                {
                    Bookmark1 = new Bookmark { BookmarkId = s.Id },
                    Bookmark2 = new Bookmark { BookmarkId = sentences2.ElementAt(count).Id }
                };
                alignments.Add(bm);
                count++;
            }

            return alignments;
        }
예제 #5
0
        public JsonResult CreateBookmarkBinding(int twinId, string id1, string id2 = null)
        {
            var tb = db.TwinBooks.Find(twinId);

            Bookmark bm1 = db.Bookmarks.Single(r => (r.InBook.Id == tb.Book1.Id) && (r.BookmarkId == id1));
            Bookmark bm2 = db.Bookmarks.Single(r => (r.InBook.Id == tb.Book2.Id) && (r.BookmarkId == id2));

            // creating new bookmark

            BookmarkBinding mark = new BookmarkBinding()
            {
                Bookmark1 = bm1,
                Bookmark2 = bm2,
                Type = 1,
                Active = true
            };

            // get active bookmarks

            var active = tb.Bookmarks.Where(b => b.Active == true && b.Type == 1).OrderBy(r => r.Bookmark1.Order);

            // get touched region

            var affected = active.Where(r => ((r.Bookmark1.Order - mark.Bookmark1.Order) * (r.Bookmark2.Order - mark.Bookmark2.Order) <= 0)
                    && (r.CreatedAt < mark.CreatedAt));

            //set inactive or delete

            foreach (var b in affected)
            {
                b.Active = false;
            }

            var upper = active.LastOrDefault(b => b.Bookmark1.Order < mark.Bookmark1.Order && b.Active == true && b.Type == 1);
            if (upper == null) upper = tb.Bookmarks.OrderBy(r => r.Bookmark1.Order).First();
            var lower = active.FirstOrDefault(b => b.Bookmark1.Order > mark.Bookmark1.Order && b.Active == true && b.Type == 1);
            if (lower == null) lower = tb.Bookmarks.OrderBy(r => r.Bookmark1.Order).Last();

            var realign = BookAligner.AlignInRange(upper, mark);
            realign.Add(mark);
            realign.AddRange(BookAligner.AlignInRange(mark, lower));

            var toDelete = tb.Bookmarks.Where(r => (r.Bookmark1.Order >= upper.Bookmark1.Order
                && r.Bookmark1.Order <= lower.Bookmark1.Order) && (r.Type == 0)).ToList();

            var inactive = tb.Bookmarks.Where(r => (r.Active == false) && (r.Type == 0)).ToList();
            toDelete.AddRange(inactive);

            foreach (var b in toDelete)
            {
                tb.Bookmarks.Remove(b);
            }

            foreach (var b in realign) {
                tb.Bookmarks.Add(b);
            }

            db.SaveChanges();

            // get realigned fragment

            var marks = tb.Bookmarks.Where(b => b.Active == true).OrderBy(b => b.Bookmark1.Order).Select(
                    b => new
                    {
                        Id = b.Id,
                        BookId1 = b.Bookmark1.InBook.Id,
                        BookId2 = b.Bookmark2.InBook.Id,
                        BookmarkId1 = b.Bookmark1.BookmarkId,
                        BookmarkId2 = b.Bookmark2.BookmarkId,
                        Order1 = b.Bookmark1.Order,
                        Order2 = b.Bookmark2.Order,
                        Type = b.Type
                    }
                );

            return Json(marks, JsonRequestBehavior.AllowGet);
        }