public void SimpleStructure() { var container = Helpers.GetSimpleStructure(); container.Add(new BookmarkLink("test", "test123") {Description = "<br>"}); var writter = new NetscapeBookmarksWritter(container); var reader = new NetscapeBookmarksReader(); var write1 = writter.ToString(); var readed = reader.Read(write1); writter = new NetscapeBookmarksWritter(readed); var write2 = writter.ToString(); readed = reader.Read(write2); Assert.AreEqual(write1, write2, true); Assert.IsNotNull(readed.AllLinks.FirstOrDefault(l => l.Title == "test123" && l.Description == "<br>"), "Description must be preserved between reads and writes"); }
public void GetBookMark() { var bookmarksString = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData\\Roaming\\Google\\Chrome\\Default\\Bookmarks"); var bookmarksfile = "E:\\bookmarks_5_17_16.html"; //var reader = new NetscapeBookmarksReader(); //var bookmarks = reader.Read(bookmarksString); //foreach (var b in bookmarks.AllLinks) //{ // Console.WriteLine("Url: {0}; Title: {1}", b.Url, b.Title); //} //Read bookmarks from file using (var file = File.OpenRead(bookmarksfile)) { var reader1 = new NetscapeBookmarksReader(); //supports encoding detection when reading from stream var bookmarks2 = reader1.Read(file); foreach (var b in bookmarks2.AllLinks.Where(l => l.LastVisit < DateTime.Today)) { Console.WriteLine("Type {0}, Title: {1}", b.GetType().Name, b.Title); } } }
public void CustomAttributes() { var container = new BookmarkFolder { new BookmarkLink("a", "b") { Attributes = new Dictionary <string, string> { { "custom", "1" } } }, new BookmarkFolder("folder") { Attributes = new Dictionary <string, string> { { "custom", "2" }, { "add_date", "ę" } } } }; var writter = new NetscapeBookmarksWritter(container); var reader = new NetscapeBookmarksReader(); var write1 = writter.ToString(); var readed = reader.Read(write1); Assert.AreEqual("1", readed.AllLinks.First().Attributes["custom"]); Assert.AreEqual("2", readed.GetAllItems <BookmarkFolder>().First().Attributes["custom"]); Assert.IsFalse(readed.GetAllItems <BookmarkFolder>().First().Attributes.ContainsKey("add_date"), "add_date is ignored attribute, it must not be written"); }
static void Main(string[] args) { try { #region Test string fileToParse = "NewTL.html"; //Read bookmarks from file using (var file = File.OpenRead(fileToParse)) { var reader = new NetscapeBookmarksReader(); //supports encoding detection when reading from stream var bookmarks = reader.Read(file); foreach (var b in bookmarks.AllLinks) { Console.WriteLine("Type: {0}, Title: {1}, Url:{2}", b.GetType().Name, b.Title, b.Url); } } #endregion } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine(); Console.Write("Press any key to exit..."); Console.ReadKey(); }
public void EmptyContainer() { var html = string.Format(HtmlTemplate, string.Empty, "utf-8"); var container = _reader.Read(html); Assert.IsNull(container.Title); Assert.IsNotNull(container.Attributes); Assert.IsFalse(container.Any()); Assert.IsFalse(container.AllItems.Any()); }
public void FFToolbarFolder() { var html = string.Format(HtmlTemplate, "<DT><H3 personal_toolbar_folder='true'><DL><DT><a href='#'>test</a></DL>", string.Empty); var reader = new NetscapeBookmarksReader(); var container = reader.Read(html); var ff = container.GetBookmarksBar(); Assert.IsNotNull(ff, "Firefox bookmarks toolbar was not found"); Assert.AreEqual("test", ff.First().Title, "Firefox bookmarks toolbar was not found"); }
public bool ReadHtmlFile(string vsFile) { //Read bookmarks from file try { cFile oFile = new cFile(vsFile); var bookmarks = oHtmlReader.Read(oFile.ReadFileStream()); foreach (var b in bookmarks.AllLinks) { oUrListList.Add(b.Url); } } catch (Exception) { return(false); } return(true); }
public void EncodingAutodetectHeaderLength() { var encoding = Encoding.GetEncoding(1257); var html = string.Format(HtmlTemplate, "<DT><a href='#;'>ĄŽ</a>", encoding.WebName); var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader {AutoDetectEncoding = true, HeaderLength = 10}; var container = reader.Read(ms); Assert.AreNotEqual("ĄŽ", container[0].Title); }
public void SimpleStructure() { var container = Helpers.GetSimpleStructure(); container.Add(new BookmarkLink("test", "test123") { Description = "<br>" }); var writter = new NetscapeBookmarksWritter(container); var reader = new NetscapeBookmarksReader(); var write1 = writter.ToString(); var readed = reader.Read(write1); writter = new NetscapeBookmarksWritter(readed); var write2 = writter.ToString(); readed = reader.Read(write2); Assert.AreEqual(write1, write2, true); Assert.IsNotNull(readed.AllLinks.FirstOrDefault(l => l.Title == "test123" && l.Description == "<br>"), "Description must be preserved between reads and writes"); }
public void EmptyContainer() { var emptyContainer = new BookmarkFolder(); var writter = new NetscapeBookmarksWritter(emptyContainer); var reader = new NetscapeBookmarksReader(); var write1 = writter.ToString(); var readed = reader.Read(write1); writter = new NetscapeBookmarksWritter(readed); var write2 = writter.ToString(); Assert.AreEqual(write1, write2, true); }
public void EncodingAutodetectAscii() { var encoding = Encoding.GetEncoding(1257); var html = string.Format(HtmlTemplate, "<DT><a href='#;'>ĄČĘĖįšųū τ</a>", encoding.WebName); var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader {AutoDetectEncoding = true}; var container = reader.Read(ms); var link = container[0]; Assert.AreEqual("ĄČĘĖįšųū ?", link.Title); }
public void StreamUnicode() { var container = Helpers.GetSimpleStructure(); container.Add(new BookmarkLink("test", "ƒ")); var ms = new MemoryStream(); var writter = new NetscapeBookmarksWritter(container) { OutputEncoding = Encoding.Unicode }; writter.Write(ms); ms = new MemoryStream(ms.GetBuffer()); var reader = new NetscapeBookmarksReader { AutoDetectEncoding = true }; var readed = reader.Read(ms); Assert.AreEqual(container.AllItems.Last().Title, readed.AllItems.Last().Title); }
public void InvalidCharset() { var encoding = Encoding.Unicode; var html = @"<html><META HTTP-EQUIV=""Content-Type"" CONTENT=""text/html; charset=FOO-32""><dl>Nothing here</dl></html>"; var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader { AutoDetectEncoding = true }; reader.Read(ms); Assert.AreEqual(Encoding.UTF8, reader.InputEncoding, "Encoding must fallback to UTF8"); }
public void EncodingAutodetectHeaderLength() { var encoding = Encoding.GetEncoding(1257); var html = string.Format(HtmlTemplate, "<DT><a href='#;'>ĄŽ</a>", encoding.WebName); var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader { AutoDetectEncoding = true, HeaderLength = 10 }; var container = reader.Read(ms); Assert.AreNotEqual("ĄŽ", container[0].Title); }
public void EncodingUtf32() { var unicodeStr = Helpers.RandomUnicodeString(147); var html = string.Format(HtmlTemplate, "<DT><a href='#'>" + unicodeStr + "</a>", "utf-32"); var bytes = Encoding.UTF32.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader { AutoDetectEncoding = false, InputEncoding = Encoding.UTF32 }; var container = reader.Read(ms); var link = container[0]; Assert.AreEqual(unicodeStr, link.Title); }
public void EncodingAutodetectUtf16() { var encoding = Encoding.Unicode; var html = string.Format(HtmlTemplate, "<DT><a href='#;'>ĄČĘĖįšųū τ</a>", encoding.WebName); var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader { AutoDetectEncoding = true }; var container = reader.Read(ms); var link = container[0]; Assert.AreEqual("ĄČĘĖįšųū τ", link.Title); }
private List <ArticlePDF> getBookMark(string sBookmarkFilePath) { List <ArticlePDF> lista = new List <ArticlePDF>(); string bookmarksString = File.ReadAllText(sBookmarkFilePath); NetscapeBookmarksReader reader = new NetscapeBookmarksReader(); BookmarkFolder bookmarksAll = reader.Read(bookmarksString); string rootFolder = "Doktorat"; IBookmarkFolder bookmarksDoc = getDoktoratFolder(bookmarksAll, rootFolder); //pobierz wszystkie z bookmark Doktorat getArticleFromFolder(lista, "", bookmarksDoc); return(lista); }
public void CustomAttributes() { var container = new BookmarkFolder { new BookmarkLink("a", "b") {Attributes = new Dictionary<string, string> {{"custom", "1"}}}, new BookmarkFolder("folder") {Attributes = new Dictionary<string, string> {{"custom", "2"}, {"add_date", "ę"}}} }; var writter = new NetscapeBookmarksWritter(container); var reader = new NetscapeBookmarksReader(); var write1 = writter.ToString(); var readed = reader.Read(write1); Assert.AreEqual("1", readed.AllLinks.First().Attributes["custom"]); Assert.AreEqual("2", readed.GetAllItems<BookmarkFolder>().First().Attributes["custom"]); Assert.IsFalse(readed.GetAllItems<BookmarkFolder>().First().Attributes.ContainsKey("add_date"), "add_date is ignored attribute, it must not be written"); }
public IndexModule() { IDatabase db = new Database(ConfigurationManager.ConnectionStrings["db"].Name); Get["/"] = _ => { //TODO: Maybe create some sort of dashboard? Worse case - just redirect to /sites? return(Response.AsRedirect("/sites")); }; /// <summary> /// Retrieves all sites. /// </summary> Get["/sites"] = _ => { List <Sites> sites = db.Fetch <Sites>(); db.Dispose(); Model = sites; return(View["index", Model]); }; /// <summary> /// Retrieves a specific site /// </summary> Get["/sites/{siteId}"] = parameter => { string Id = parameter.siteId; var site = db.FetchBy <Sites>(sql => sql.Where(x => x.SiteId == Id)); List <Tags> AllTags = db.Fetch <Tags>().ToList(); List <SiteTags> Tags = db.FetchBy <SiteTags>(sql => sql.Where(x => x.SiteId == Id)).ToList(); List <Tags> tagList = AllTags.Where(allTags => Tags.Select(tags => tags.TagId).Contains(allTags.TagId)).ToList(); bool firstCSV = true; StringBuilder tagsCSV = new StringBuilder(); foreach (var tag in tagList) { if (!firstCSV) { tagsCSV.Append(","); } tagsCSV.Append(tag.TagName); firstCSV = false; } Model.site = site; Model.tags = tagsCSV.ToString(); db.Dispose(); return(View["update", Model]); }; Post["/sites/meta"] = parameter => { string requestedUrl = string.Empty; if (Request.Form.Values.Count > 0) { foreach (var i in Request.Form.Values) { if (!string.IsNullOrWhiteSpace(requestedUrl)) { break; } requestedUrl = i; } } if (UriChecker.IsValidURI(requestedUrl)) { SitesMeta metadata = GetMetaData(requestedUrl); return(Response.AsJson(metadata)); } else { return(HttpStatusCode.BadRequest); } }; /// <summary> /// Update a specific site /// </summary> Put["/sites/{siteId}"] = parameter => { string Id = parameter.siteId; Sites snapshot = db.FetchBy <Sites>(sql => sql.Where(x => x.SiteId == Id)).FirstOrDefault(); Sites site = this.Bind <Sites>(); // Don't clear out fields existing fields. site.Active = snapshot.Active; site.DateTime = snapshot.DateTime; site.MetaTitle = snapshot.MetaTitle; site.MetaDescription = snapshot.MetaDescription; site.MetaKeywords = snapshot.MetaKeywords; db.Update(site); db.Dispose(); string TagsPost = Request.Form.Tags.Value; List <string> Tags = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList(); List <Tags> AllTags = db.Fetch <Tags>(); db.Dispose(); List <string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList(); //Delete all existing Tags for current site before linking up any new tags db.Delete <SiteTags>("where SiteId = @0", Id); db.Dispose(); foreach (string tag in Tags) { if (!AllTagNames.Contains(tag)) { Tags newTag = new Tags(); newTag.TagId = ShortGuid.NewGuid().ToString(); newTag.TagName = tag; newTag.Active = true; db.Insert(newTag); db.Dispose(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = newTag.TagId; db.Insert(newSiteTag); db.Dispose(); } else { try { var ExistingTag = db.FetchBy <Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = ExistingTag.TagId; db.Insert(newSiteTag); db.Dispose(); } catch { //Move along } } } return(Response.AsRedirect("/sites/" + Id)); }; /// <summary> /// View for adding a new site /// </summary> Get["/sites/new"] = _ => { return(View["sites", Model]); }; Post["/sites/bulk"] = _ => { var file = Request.Files.FirstOrDefault(); if (file != null) { var reader = new NetscapeBookmarksReader(); var bookmarks = reader.Read(file.Value); foreach (var b in bookmarks.AllLinks) { //Don't create new bookmark if it already exists if (!CheckIfBookmarkAlreadyExists(b.Url)) { Debug.WriteLine("Type {0}, Title: {1}", b.GetType().Name, b.Title); } } } return(Response.AsRedirect("/sites")); }; /// <summary> /// Creates a new site /// </summary> Post["/sites"] = parameters => { Sites site = this.Bind <Sites>(); //Don't create new bookmark if it already exists if (!CheckIfBookmarkAlreadyExists(site.Url)) { site.SiteId = ShortGuid.NewGuid().ToString(); site.Active = true; site.DateTime = DateTime.UtcNow; //Get the MetaData if it is a valid URI if (UriChecker.IsValidURI(site.Url)) { SitesMeta metadata = GetMetaData(site.Url); site.MetaTitle = metadata.MetaTitle; site.MetaDescription = metadata.MetaDescription; site.MetaKeywords = metadata.MetaKeywords; } db.Insert(site); db.Dispose(); //Get the tags for the bookmark and split them to a list string TagsPost = Request.Form.Tags.Value; List <string> Tags = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList(); //Get all of the existing tags List <Tags> AllTags = db.Fetch <Tags>(); db.Dispose(); //Get a list of the TagNames from of all the existing tags List <string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList(); //Check if the tag for the current bookmark already exists in the list of tags foreach (string tag in Tags) { //Add a new tag since it doesn't exist if (!AllTagNames.Contains(tag)) { Tags newTag = new Tags(); newTag.TagId = ShortGuid.NewGuid().ToString(); newTag.TagName = tag; newTag.Active = true; db.Insert(newTag); //Link the tag with the site SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = newTag.TagId; db.Insert(newSiteTag); db.Dispose(); } else { //Since the tag already exists, just link the tag with the site var ExistingTag = db.FetchBy <Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = ExistingTag.TagId; db.Insert(newSiteTag); db.Dispose(); } } //Redirect to the new site return(Context.GetRedirect("~/sites/" + site.SiteId)); } //TODO: Probably would be better to redirect to the existing page. return(Response.AsRedirect("/sites")); }; }
public IndexModule() { IDatabase db = new Database(ConfigurationManager.ConnectionStrings["db"].Name); Get["/"] = _ => { //TODO: Maybe create some sort of dashboard? Worse case - just redirect to /sites? return Response.AsRedirect("/sites"); }; /// <summary> /// Retrieves all sites. /// </summary> Get["/sites"] = _ => { List<Sites> sites = db.Fetch<Sites>(); db.Dispose(); Model = sites; return View["index", Model]; }; /// <summary> /// Retrieves a specific site /// </summary> Get["/sites/{siteId}"] = parameter => { string Id = parameter.siteId; var site = db.FetchBy<Sites>(sql => sql.Where(x => x.SiteId == Id)); List<Tags> AllTags = db.Fetch<Tags>().ToList(); List<SiteTags> Tags = db.FetchBy<SiteTags>(sql => sql.Where(x => x.SiteId == Id)).ToList(); List<Tags> tagList = AllTags.Where(allTags => Tags.Select(tags => tags.TagId).Contains(allTags.TagId)).ToList(); bool firstCSV = true; StringBuilder tagsCSV = new StringBuilder(); foreach (var tag in tagList) { if (!firstCSV) { tagsCSV.Append(","); } tagsCSV.Append(tag.TagName); firstCSV = false; } Model.site = site; Model.tags = tagsCSV.ToString(); db.Dispose(); return View["update", Model]; }; Post["/sites/meta"] = parameter => { string requestedUrl = string.Empty; if (Request.Form.Values.Count > 0) { foreach (var i in Request.Form.Values) { if (!string.IsNullOrWhiteSpace(requestedUrl)) { break; } requestedUrl = i; } } if (UriChecker.IsValidURI(requestedUrl)) { SitesMeta metadata = GetMetaData(requestedUrl); return Response.AsJson(metadata); } else { return HttpStatusCode.BadRequest; } }; /// <summary> /// Update a specific site /// </summary> Put["/sites/{siteId}"] = parameter => { string Id = parameter.siteId; Sites snapshot = db.FetchBy<Sites>(sql => sql.Where(x => x.SiteId == Id)).FirstOrDefault(); Sites site = this.Bind<Sites>(); // Don't clear out fields existing fields. site.Active = snapshot.Active; site.DateTime = snapshot.DateTime; site.MetaTitle = snapshot.MetaTitle; site.MetaDescription = snapshot.MetaDescription; site.MetaKeywords = snapshot.MetaKeywords; db.Update(site); db.Dispose(); string TagsPost = Request.Form.Tags.Value; List<string> Tags = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList(); List<Tags> AllTags = db.Fetch<Tags>(); db.Dispose(); List<string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList(); //Delete all existing Tags for current site before linking up any new tags db.Delete<SiteTags>("where SiteId = @0", Id); db.Dispose(); foreach (string tag in Tags) { if (!AllTagNames.Contains(tag)) { Tags newTag = new Tags(); newTag.TagId = ShortGuid.NewGuid().ToString(); newTag.TagName = tag; newTag.Active = true; db.Insert(newTag); db.Dispose(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = newTag.TagId; db.Insert(newSiteTag); db.Dispose(); } else { try { var ExistingTag = db.FetchBy<Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = ExistingTag.TagId; db.Insert(newSiteTag); db.Dispose(); } catch { //Move along } } } return Response.AsRedirect("/sites/" + Id); }; /// <summary> /// View for adding a new site /// </summary> Get["/sites/new"] = _ => { return View["sites", Model]; }; Post["/sites/bulk"] = _ => { var file = Request.Files.FirstOrDefault(); if (file != null) { var reader = new NetscapeBookmarksReader(); var bookmarks = reader.Read(file.Value); foreach (var b in bookmarks.AllLinks) { //Don't create new bookmark if it already exists if (!CheckIfBookmarkAlreadyExists(b.Url)) { Debug.WriteLine("Type {0}, Title: {1}", b.GetType().Name, b.Title); } } } return Response.AsRedirect("/sites"); }; /// <summary> /// Creates a new site /// </summary> Post["/sites"] = parameters => { Sites site = this.Bind<Sites>(); //Don't create new bookmark if it already exists if (!CheckIfBookmarkAlreadyExists(site.Url)) { site.SiteId = ShortGuid.NewGuid().ToString(); site.Active = true; site.DateTime = DateTime.UtcNow; //Get the MetaData if it is a valid URI if (UriChecker.IsValidURI(site.Url)) { SitesMeta metadata = GetMetaData(site.Url); site.MetaTitle = metadata.MetaTitle; site.MetaDescription = metadata.MetaDescription; site.MetaKeywords = metadata.MetaKeywords; } db.Insert(site); db.Dispose(); //Get the tags for the bookmark and split them to a list string TagsPost = Request.Form.Tags.Value; List<string> Tags = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList(); //Get all of the existing tags List<Tags> AllTags = db.Fetch<Tags>(); db.Dispose(); //Get a list of the TagNames from of all the existing tags List<string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList(); //Check if the tag for the current bookmark already exists in the list of tags foreach (string tag in Tags) { //Add a new tag since it doesn't exist if (!AllTagNames.Contains(tag)) { Tags newTag = new Tags(); newTag.TagId = ShortGuid.NewGuid().ToString(); newTag.TagName = tag; newTag.Active = true; db.Insert(newTag); //Link the tag with the site SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = newTag.TagId; db.Insert(newSiteTag); db.Dispose(); } else { //Since the tag already exists, just link the tag with the site var ExistingTag = db.FetchBy<Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault(); SiteTags newSiteTag = new SiteTags(); newSiteTag.SiteId = site.SiteId; newSiteTag.TagId = ExistingTag.TagId; db.Insert(newSiteTag); db.Dispose(); } } //Redirect to the new site return Context.GetRedirect("~/sites/" + site.SiteId); } //TODO: Probably would be better to redirect to the existing page. return Response.AsRedirect("/sites"); }; }
public void EncodingUtf32() { var unicodeStr = Helpers.RandomUnicodeString(147); var html = string.Format(HtmlTemplate, "<DT><a href='#'>" + unicodeStr + "</a>", "utf-32"); var bytes = Encoding.UTF32.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader {AutoDetectEncoding = false, InputEncoding = Encoding.UTF32}; var container = reader.Read(ms); var link = container[0]; Assert.AreEqual(unicodeStr, link.Title); }
public void InvalidCharset() { var encoding = Encoding.Unicode; var html = @"<html><META HTTP-EQUIV=""Content-Type"" CONTENT=""text/html; charset=FOO-32""><dl>Nothing here</dl></html>"; var bytes = encoding.GetBytes(html); var ms = new MemoryStream(bytes); var reader = new NetscapeBookmarksReader {AutoDetectEncoding = true}; reader.Read(ms); Assert.AreEqual(Encoding.UTF8, reader.InputEncoding, "Encoding must fallback to UTF8"); }
public void InvalidDocument() { var reader = new NetscapeBookmarksReader(); reader.Read("<html><b>Nothing here</b></html>"); }