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; }
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); }
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; }
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; }
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); }