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 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 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 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 void SimpleStructure()
        {
            var container = Helpers.GetSimpleStructure();

            container.Add(new BookmarkLink("test", "test123")
            {
                Description = "<br>"
            });
            var writter = new NetscapeBookmarksWriter(container);
            var reader  = new NetscapeBookmarksReader();
            var write1  = writter.ToString();
            var readed  = reader.Read(write1);

            writter = new NetscapeBookmarksWriter(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 StreamUnicode()
        {
            var container = Helpers.GetSimpleStructure();

            container.Add(new BookmarkLink("test", "ƒ"));
            var ms      = new MemoryStream();
            var writter = new NetscapeBookmarksWriter(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 GetBookMarkStream()
        {
            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();

            using (var s = new FileStream(bookmarksfile, FileMode.Open))
            {
                var c = reader.Read(s);

                var r = JsonConvert.SerializeObject(c);

                File.WriteAllText("E:\\Json", r);


                Assert.AreEqual(c.Count, 10);
            }

            //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);
                }
            }
        }
Example #10
0
 public NetscapeReaderTests()
 {
     _reader = new NetscapeBookmarksReader();
 }
 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 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>");
 }
Example #14
0
        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 NetscapeReaderTests()
        {
            _reader = new NetscapeBookmarksReader();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        }
        public void InvalidDocument()
        {
            var reader = new NetscapeBookmarksReader();

            reader.Read("<html><b>Nothing here</b></html>");
        }
 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);
 }
Example #18
0
        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 NetscapeReaderTests()
 {
     _reader = new NetscapeBookmarksReader();
 }