Skip to content

Commit 8a33bf4

Browse files
authored
Merge pull request #695 from Flow-Launcher/BrowserBookmarkRefactor
Refactor Bookmark plugin
2 parents 637dae9 + 309006e commit 8a33bf4

22 files changed

+455
-313
lines changed

Plugins/Flow.Launcher.Plugin.BrowserBookmark/Bookmark.cs

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Flow.Launcher.Plugin.BrowserBookmark.Models;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Text.RegularExpressions;
7+
8+
namespace Flow.Launcher.Plugin.BrowserBookmark
9+
{
10+
public class ChromeBookmarkLoader : ChromiumBookmarkLoader
11+
{
12+
public override List<Bookmark> GetBookmarks()
13+
{
14+
return LoadChromeBookmarks();
15+
}
16+
17+
private List<Bookmark> LoadChromeBookmarks()
18+
{
19+
var bookmarks = new List<Bookmark>();
20+
String platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
21+
bookmarks.AddRange(LoadBookmarks(Path.Combine(platformPath, @"Google\Chrome\User Data"), "Google Chrome"));
22+
bookmarks.AddRange(LoadBookmarks(Path.Combine(platformPath, @"Google\Chrome SxS\User Data"), "Google Chrome Canary"));
23+
bookmarks.AddRange(LoadBookmarks(Path.Combine(platformPath, @"Chromium\User Data"), "Chromium"));
24+
return bookmarks;
25+
}
26+
}
27+
}

Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromeBookmarks.cs

Lines changed: 0 additions & 87 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Flow.Launcher.Plugin.BrowserBookmark.Models;
2+
using Microsoft.AspNetCore.Authentication;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Text.Json;
6+
7+
namespace Flow.Launcher.Plugin.BrowserBookmark
8+
{
9+
public abstract class ChromiumBookmarkLoader : IBookmarkLoader
10+
{
11+
public abstract List<Bookmark> GetBookmarks();
12+
protected List<Bookmark> LoadBookmarks(string browserDataPath, string name)
13+
{
14+
var bookmarks = new List<Bookmark>();
15+
if (!Directory.Exists(browserDataPath)) return bookmarks;
16+
var paths = Directory.GetDirectories(browserDataPath);
17+
18+
foreach (var profile in paths)
19+
{
20+
var bookmarkPath = Path.Combine(profile, "Bookmarks");
21+
if (!File.Exists(bookmarkPath))
22+
continue;
23+
24+
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
25+
bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source));
26+
}
27+
return bookmarks;
28+
}
29+
30+
protected List<Bookmark> LoadBookmarksFromFile(string path, string source)
31+
{
32+
if (!File.Exists(path))
33+
return new();
34+
var bookmarks = new List<Bookmark>();
35+
using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path));
36+
if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement))
37+
return new();
38+
foreach (var folder in rootElement.EnumerateObject())
39+
{
40+
EnumerateFolderBookmark(folder.Value, bookmarks, source);
41+
}
42+
return bookmarks;
43+
}
44+
45+
private void EnumerateFolderBookmark(JsonElement folderElement, List<Bookmark> bookmarks, string source)
46+
{
47+
foreach (var subElement in folderElement.GetProperty("children").EnumerateArray())
48+
{
49+
switch (subElement.GetProperty("type").GetString())
50+
{
51+
case "folder":
52+
EnumerateFolderBookmark(subElement, bookmarks, source);
53+
break;
54+
default:
55+
bookmarks.Add(new Bookmark(
56+
subElement.GetProperty("name").GetString(),
57+
subElement.GetProperty("url").GetString(),
58+
source));
59+
break;
60+
}
61+
}
62+
63+
}
64+
}
65+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Flow.Launcher.Infrastructure;
4+
using Flow.Launcher.Plugin.BrowserBookmark.Models;
5+
using Flow.Launcher.Plugin.SharedModels;
6+
7+
namespace Flow.Launcher.Plugin.BrowserBookmark.Commands
8+
{
9+
internal static class BookmarkLoader
10+
{
11+
internal static MatchResult MatchProgram(Bookmark bookmark, string queryString)
12+
{
13+
var match = StringMatcher.FuzzySearch(queryString, bookmark.Name);
14+
if (match.IsSearchPrecisionScoreMet())
15+
return match;
16+
17+
return StringMatcher.FuzzySearch(queryString, bookmark.Url);
18+
}
19+
20+
internal static List<Bookmark> LoadAllBookmarks(Settings setting)
21+
{
22+
23+
var chromeBookmarks = new ChromeBookmarkLoader();
24+
var mozBookmarks = new FirefoxBookmarkLoader();
25+
var edgeBookmarks = new EdgeBookmarkLoader();
26+
27+
var allBookmarks = new List<Bookmark>();
28+
29+
// Add Firefox bookmarks
30+
allBookmarks.AddRange(mozBookmarks.GetBookmarks());
31+
32+
// Add Chrome bookmarks
33+
allBookmarks.AddRange(chromeBookmarks.GetBookmarks());
34+
35+
// Add Edge (Chromium) bookmarks
36+
allBookmarks.AddRange(edgeBookmarks.GetBookmarks());
37+
38+
foreach (var browser in setting.CustomChromiumBrowsers)
39+
{
40+
var loader = new CustomChromiumBookmarkLoader(browser);
41+
allBookmarks.AddRange(loader.GetBookmarks());
42+
}
43+
44+
return allBookmarks.Distinct().ToList();
45+
}
46+
}
47+
}

Plugins/Flow.Launcher.Plugin.BrowserBookmark/Commands/Bookmarks.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Flow.Launcher.Plugin.BrowserBookmark.Models;
2+
using System.Collections.Generic;
3+
4+
namespace Flow.Launcher.Plugin.BrowserBookmark
5+
{
6+
public class CustomChromiumBookmarkLoader : ChromiumBookmarkLoader
7+
{
8+
public CustomChromiumBookmarkLoader(CustomBrowser browser)
9+
{
10+
BrowserName = browser.Name;
11+
BrowserDataPath = browser.DataDirectoryPath;
12+
}
13+
public string BrowserDataPath { get; init; }
14+
public string BookmarkFilePath { get; init; }
15+
public string BrowserName { get; init; }
16+
17+
public override List<Bookmark> GetBookmarks() => BrowserDataPath != null ? LoadBookmarks(BrowserDataPath, BrowserName) : LoadBookmarksFromFile(BookmarkFilePath, BrowserName);
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Flow.Launcher.Plugin.BrowserBookmark.Models;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Text.Json;
7+
using System.Text.RegularExpressions;
8+
9+
namespace Flow.Launcher.Plugin.BrowserBookmark
10+
{
11+
public class EdgeBookmarkLoader : ChromiumBookmarkLoader
12+
{
13+
14+
private readonly List<Bookmark> _bookmarks = new();
15+
16+
private void LoadEdgeBookmarks()
17+
{
18+
var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
19+
LoadBookmarks(Path.Combine(platformPath, @"Microsoft\Edge\User Data"), "Microsoft Edge");
20+
LoadBookmarks(Path.Combine(platformPath, @"Microsoft\Edge Dev\User Data"), "Microsoft Edge Dev");
21+
LoadBookmarks(Path.Combine(platformPath, @"Microsoft\Edge SxS\User Data"), "Microsoft Edge Canary");
22+
}
23+
24+
public override List<Bookmark> GetBookmarks()
25+
{
26+
_bookmarks.Clear();
27+
LoadEdgeBookmarks();
28+
return _bookmarks;
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)