using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; namespace Flow.Launcher.Plugin.BrowserBookmark { public class EdgeBookmarks { private List bookmarks = new List(); public List GetBookmarks() { bookmarks.Clear(); LoadEdgeBookmarks(); return bookmarks; } private void ParseEdgeBookmarks(string path, string source) { if (!File.Exists(path)) return; string all = File.ReadAllText(path); Regex nameRegex = new Regex("\"name\": \"(?.*?)\""); MatchCollection nameCollection = nameRegex.Matches(all); Regex typeRegex = new Regex("\"type\": \"(?.*?)\""); MatchCollection typeCollection = typeRegex.Matches(all); Regex urlRegex = new Regex("\"url\": \"(?.*?)\""); MatchCollection urlCollection = urlRegex.Matches(all); List names = (from Match match in nameCollection select match.Groups["name"].Value).ToList(); List types = (from Match match in typeCollection select match.Groups["type"].Value).ToList(); List urls = (from Match match in urlCollection select match.Groups["url"].Value).ToList(); int urlIndex = 0; for (int i = 0; i < names.Count; i++) { string name = DecodeUnicode(names[i]); string type = types[i]; if (type == "url") { string url = urls[urlIndex]; urlIndex++; if (url == null) continue; if (url.StartsWith("javascript:", StringComparison.OrdinalIgnoreCase)) continue; if (url.StartsWith("vbscript:", StringComparison.OrdinalIgnoreCase)) continue; bookmarks.Add(new Bookmark() { Name = name, Url = url, Source = source }); } } } private void LoadEdgeBookmarks(string path, string name) { if (!Directory.Exists(path)) return; var paths = Directory.GetDirectories(path); foreach (var profile in paths) { if (File.Exists(Path.Combine(profile, "Bookmarks"))) ParseEdgeBookmarks(Path.Combine(profile, "Bookmarks"), name + (Path.GetFileName(profile) == "Default" ? "" : (" (" + Path.GetFileName(profile) + ")"))); } } private void LoadEdgeBookmarks() { string platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); LoadEdgeBookmarks(Path.Combine(platformPath, @"Microsoft\Edge\User Data"), "Microsoft Edge"); LoadEdgeBookmarks(Path.Combine(platformPath, @"Microsoft\Edge Dev\User Data"), "Microsoft Edge Dev"); LoadEdgeBookmarks(Path.Combine(platformPath, @"Microsoft\Edge SxS\User Data"), "Microsoft Edge Canary"); } private string DecodeUnicode(string dataStr) { Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})"); return reg.Replace(dataStr, m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()); } } }