Skip to content

Commit 9e76065

Browse files
Use an aggregator for the bookmark sources, refactor the output to show in config only
1 parent e4dba97 commit 9e76065

File tree

8 files changed

+105
-37
lines changed

8 files changed

+105
-37
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Spectre.Console;
2+
using TinyCity.Model;
3+
4+
namespace TinyCity.BookmarkEngines
5+
{
6+
public class BookmarkAggregator
7+
{
8+
private ChromeBookmarks _chromeBookmarks;
9+
private MarkdownBookmarks _markdownBookmarks;
10+
private HtmlBookmarks _htmlBookmarks;
11+
12+
public List<BookmarkNode> AllBookmarks { get; }
13+
14+
public BookmarkAggregator(ChromeBookmarks chromeBookmarks, MarkdownBookmarks markdownBookmarks, HtmlBookmarks htmlBookmarks)
15+
{
16+
_chromeBookmarks = chromeBookmarks;
17+
_markdownBookmarks = markdownBookmarks;
18+
_htmlBookmarks = htmlBookmarks;
19+
20+
AllBookmarks = new List<BookmarkNode>();
21+
AllBookmarks = [.. chromeBookmarks.FlattenedBookmarks, .. markdownBookmarks.Bookmarks, .. htmlBookmarks.Bookmarks];
22+
AllBookmarks = AllBookmarks.Distinct().ToList();
23+
}
24+
25+
public void WriteLoadedLog()
26+
{
27+
AnsiConsole.MarkupLine(_chromeBookmarks.GetLog());
28+
AnsiConsole.MarkupLine(_htmlBookmarks.GetLog());
29+
30+
foreach (string item in _markdownBookmarks.GetLog())
31+
{
32+
AnsiConsole.MarkupLine(item);
33+
}
34+
}
35+
}
36+
}

BookmarkEngines/ChromeBookmarks.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
using Spectre.Console;
2-
using System.Text.Json;
1+
using System.Text.Json;
32
using TinyCity.Model;
43

54
namespace TinyCity.BookmarkEngines
65
{
76
public class ChromeBookmarks
87
{
98
public List<BookmarkNode> FlattenedBookmarks { get; set; } = new List<BookmarkNode>();
9+
private string _log;
1010

1111
public ChromeBookmarks(TinyCitySettings settings)
1212
{
1313
string bookmarksPath = Path.Combine(settings.BrowserPath, "Bookmarks");
1414

1515
if (!Path.Exists(bookmarksPath))
1616
{
17-
AnsiConsole.MarkupLine($"[bold yellow] - Couldn't find '{bookmarksPath}' so skipping.[/]");
17+
_log = $" - Browser bookmarks: Couldn't find '{bookmarksPath}' so skipping.";
1818
return;
1919
}
2020

@@ -34,7 +34,13 @@ public ChromeBookmarks(TinyCitySettings settings)
3434

3535
FlattenedBookmarks = [.. bookmarkBarNodes, .. otherNodes, .. syncedNodes];
3636
}
37-
AnsiConsole.MarkupLine($" - Loaded {FlattenedBookmarks.Count} bookmarks from '{bookmarksPath}'.");
37+
38+
_log = $" - Browser bookmarks: Loaded {FlattenedBookmarks.Count} bookmarks from '{bookmarksPath}'.";
39+
}
40+
41+
public string GetLog()
42+
{
43+
return _log;
3844
}
3945

4046
static List<BookmarkNode> FlattenNodes(BookmarkNode bookmarkNode)

BookmarkEngines/HtmlBookmarks.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Spectre.Console;
2-
using TinyCity.Model;
1+
using TinyCity.Model;
32
using AngleSharp;
43
using AngleSharp.Dom;
54

@@ -15,26 +14,30 @@ namespace TinyCity.BookmarkEngines
1514
public class HtmlBookmarks
1615
{
1716
public List<BookmarkNode> Bookmarks { get; set; } = new List<BookmarkNode>();
17+
private string _log;
1818

1919
public HtmlBookmarks(TinyCitySettings settings)
2020
{
2121
string htmlFilePath = settings.HtmlBookmarksFile;
2222
if (string.IsNullOrEmpty(htmlFilePath))
2323
{
24-
AnsiConsole.MarkupLine($" - HTML bookmarks: no file specified in settings so skipping");
24+
_log = " - HTML bookmarks: no file specified in the settings.";
2525
return;
2626
}
2727
else if (!File.Exists(htmlFilePath))
2828
{
29-
AnsiConsole.MarkupLine($"[bold yellow] - HTML bookmarks: couldn't find '{htmlFilePath}' so skipping.[/]");
29+
_log = $" - HTML bookmarks: couldn't find '{htmlFilePath}' so skipping.";
3030
return;
3131
}
3232

3333
string html = File.ReadAllText(htmlFilePath);
3434
var bookmarks = ParseHtmlFile(html).GetAwaiter().GetResult();
3535
Bookmarks.AddRange(bookmarks);
36+
}
3637

37-
AnsiConsole.MarkupLine($" - HTML bookmarks: loaded {bookmarks.Count} bookmarks from '{htmlFilePath}'.");
38+
public string GetLog()
39+
{
40+
return _log;
3841
}
3942

4043
private async Task<List<BookmarkNode>> ParseHtmlFile(string html)

BookmarkEngines/MarkdownBookmarks.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
using Markdig;
22
using Markdig.Syntax;
33
using Markdig.Syntax.Inlines;
4-
using Spectre.Console;
54
using TinyCity.Model;
65

76
namespace TinyCity.BookmarkEngines
87
{
98
public class MarkdownBookmarks
109
{
1110
public List<BookmarkNode> Bookmarks { get; set; } = new List<BookmarkNode>();
11+
private List<string> logItems = new List<string>();
1212

1313
public MarkdownBookmarks(TinyCitySettings settings)
1414
{
15+
if (settings.MarkdownFiles.Count == 0)
16+
{
17+
logItems.Add(" - Markdown bookmarks: no files specified in the settings.");
18+
return;
19+
}
20+
1521
foreach (var file in settings.MarkdownFiles)
1622
{
1723
if (File.Exists(file))
@@ -20,15 +26,20 @@ public MarkdownBookmarks(TinyCitySettings settings)
2026
var bookmarks = ParseMarkdownFile(markdown);
2127
Bookmarks.AddRange(bookmarks);
2228

23-
AnsiConsole.MarkupLine($" - Markdown bookmarks: Loaded {bookmarks.Count} bookmarks from '{file}'.");
29+
logItems.Add($" - Markdown bookmarks: Loaded {bookmarks.Count} bookmarks from '{file}'.");
2430
}
2531
else
2632
{
27-
AnsiConsole.MarkupLine($"[bold yellow] - Markdown bookmarks: couldn't find '{file}' so skipping.[/]");
33+
logItems.Add($" - Markdown bookmarks: couldn't find '{file}' so skipping.");
2834
}
2935
}
3036
}
3137

38+
public List<string> GetLog()
39+
{
40+
return logItems;
41+
}
42+
3243
private List<BookmarkNode> ParseMarkdownFile(string markdown)
3344
{
3445
var document = Markdown.Parse(markdown);

Commands/ConfigCommand.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using Spectre.Console.Cli;
33
using System.ComponentModel;
44
using System.Linq;
5+
using TinyCity.BookmarkEngines;
6+
using TinyCity.Model;
57

68
namespace TinyCity.Commands
79
{
@@ -32,9 +34,12 @@ public class ConfigCommandSettings : CommandSettings
3234
public class ConfigCommand : Command<ConfigCommandSettings>
3335
{
3436
private readonly TinyCitySettings _tinyCitySettings;
35-
public ConfigCommand(TinyCitySettings settings)
37+
private readonly BookmarkAggregator _bookmarkAggregator;
38+
39+
public ConfigCommand(TinyCitySettings settings, BookmarkAggregator bookmarkAggregator)
3640
{
3741
_tinyCitySettings = settings;
42+
_bookmarkAggregator = bookmarkAggregator;
3843
}
3944

4045
public override int Execute(CommandContext context, ConfigCommandSettings settings)
@@ -65,14 +70,27 @@ public override int Execute(CommandContext context, ConfigCommandSettings settin
6570

6671
private void ShowConfiguration()
6772
{
68-
AnsiConsole.MarkupLine($"[bold green]Loaded config file from: {TinyCitySettings.GetConfigFilePath()}[/]");
69-
AnsiConsole.MarkupLine($"[green]- Home Directory: {_tinyCitySettings.ApplicationConfigDirectory}[/]");
70-
AnsiConsole.MarkupLine($"[green]- Browser path: {_tinyCitySettings.BrowserPath}[/]");
71-
AnsiConsole.MarkupLine($"[green]- HTML bookmarkpath: {_tinyCitySettings.HtmlBookmarksFile}[/]");
72-
AnsiConsole.MarkupLine($"[green]- Markdown Files:[/]");
73-
foreach (var file in _tinyCitySettings.MarkdownFiles)
73+
AnsiConsole.MarkupLine($"[deepskyblue1]Bookmark sources ({_bookmarkAggregator.AllBookmarks.Count} unique bookmarks in total):[/]");
74+
_bookmarkAggregator.WriteLoadedLog();
75+
76+
AnsiConsole.MarkupLine($"[deepskyblue1]Configuration ('{TinyCitySettings.GetConfigFilePath()}'):[/]");
77+
AnsiConsole.MarkupLine($" - Home Directory: {_tinyCitySettings.ApplicationConfigDirectory}.");
78+
AnsiConsole.MarkupLine($" - Browser path: {_tinyCitySettings.BrowserPath}.");
79+
80+
string htmlFilePath = _tinyCitySettings.HtmlBookmarksFile ?? "(none)";
81+
AnsiConsole.MarkupLine($" - HTML bookmarkpath: {htmlFilePath}.");
82+
83+
if (_tinyCitySettings.MarkdownFiles.Count > 0)
84+
{
85+
AnsiConsole.MarkupLine($" - Markdown Files:");
86+
foreach (var file in _tinyCitySettings.MarkdownFiles)
87+
{
88+
AnsiConsole.MarkupLine($" - {file}");
89+
}
90+
}
91+
else
7492
{
75-
AnsiConsole.MarkupLine($" - {file}");
93+
AnsiConsole.MarkupLine($" - Markdown Files: (none)");
7694
}
7795
}
7896

Commands/ListCommand.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@ public class ListCommand : Command<ListCommandSettings>
1313
{
1414
private List<BookmarkNode> _combinedBookmarks;
1515

16-
public ListCommand(ChromeBookmarks chromeBookmarks, MarkdownBookmarks markdownBookmarks, HtmlBookmarks htmlBookmarks)
16+
public ListCommand(BookmarkAggregator bookmarkAggregator)
1717
{
18-
_combinedBookmarks = new List<BookmarkNode>();
19-
_combinedBookmarks = [.. chromeBookmarks.FlattenedBookmarks, .. markdownBookmarks.Bookmarks, .. htmlBookmarks.Bookmarks];
20-
_combinedBookmarks = _combinedBookmarks.Distinct().ToList();
18+
_combinedBookmarks = bookmarkAggregator.AllBookmarks;
2119
}
2220

2321
public override int Execute(CommandContext context, ListCommandSettings settings)
2422
{
25-
AnsiConsole.MarkupLine($"[bold green]{_combinedBookmarks.Count} unique bookmarks in total.[/]");
23+
AnsiConsole.MarkupLine($"[bold deepskyblue1]{_combinedBookmarks.Count} unique bookmarks in total.[/]");
2624

2725
foreach (var bookmark in _combinedBookmarks.OrderBy(x => x.Name))
2826
{
@@ -33,7 +31,7 @@ public override int Execute(CommandContext context, ListCommandSettings settings
3331

3432
string link = $"[link={bookmarkUrl}]{bookmarkName}[/]";
3533
string urlHost = new Uri(bookmark.Url).Host;
36-
AnsiConsole.MarkupLine($"[bold chartreuse1]{link}[/] ({urlHost})");
34+
AnsiConsole.MarkupLine($" - [bold chartreuse1]{link}[/] ({urlHost})");
3735
}
3836
}
3937

Commands/SearchCommand.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,26 @@ public class SearchCommandSettings : CommandSettings
2424
public required string Query { get; set; }
2525
}
2626

27-
// https://spectreconsole.net/cli/introduction
2827
public class SearchCommand : Command<SearchCommandSettings>
2928
{
3029
private List<BookmarkNode> _combinedBookmarks;
3130

32-
public SearchCommand(ChromeBookmarks chromeBookmarks, MarkdownBookmarks markdownBookmarks, HtmlBookmarks htmlBookmarks)
31+
public SearchCommand(BookmarkAggregator bookmarkAggregator)
3332
{
34-
_combinedBookmarks = new List<BookmarkNode>();
35-
_combinedBookmarks = [.. chromeBookmarks.FlattenedBookmarks, .. markdownBookmarks.Bookmarks, .. htmlBookmarks.Bookmarks];
36-
_combinedBookmarks = _combinedBookmarks.Distinct().ToList();
33+
_combinedBookmarks = bookmarkAggregator.AllBookmarks;
3734
}
3835

3936
public override int Execute(CommandContext context, SearchCommandSettings settings)
4037
{
41-
AnsiConsole.MarkupLine($"[bold green]{_combinedBookmarks.Count} bookmarks in total.[/]");
42-
4338
var filteredBookmarks = Search(settings.Query, settings.SearchUrls);
4439
int count = filteredBookmarks.Count;
4540
if (count == 0)
4641
{
47-
AnsiConsole.MarkupLine($" - [bold yellow]No bookmarks found for '{settings.Query}'[/]");
42+
AnsiConsole.MarkupLine($"[bold yellow]No bookmarks found for '{settings.Query}'.[/]");
4843
return 0;
4944
}
5045

51-
AnsiConsole.MarkupLine($"[bold green]{count} bookmark(s) found for '{settings.Query}'[/]");
46+
AnsiConsole.MarkupLine($"[bold deepskyblue1]{count} bookmark(s) found for '{settings.Query}'.[/]");
5247
foreach (var bookmark in filteredBookmarks)
5348
{
5449
if (!string.IsNullOrEmpty(bookmark.Url))
@@ -58,14 +53,14 @@ public override int Execute(CommandContext context, SearchCommandSettings settin
5853

5954
string link = $"[link={bookmarkUrl}]{bookmarkName}[/]";
6055
string urlHost = new Uri(bookmark.Url).Host;
61-
AnsiConsole.MarkupLine($" - [bold chartreuse1]{link}[/] ({urlHost})");
56+
AnsiConsole.MarkupLine($" - [bold chartreuse1]{link}[/] ({urlHost})");
6257
}
6358
}
6459

6560
if (settings.Launch)
6661
{
6762
var first = filteredBookmarks.FirstOrDefault();
68-
AnsiConsole.MarkupLine($" - [bold green]Launching {first.Name}[/]");
63+
AnsiConsole.MarkupLine($" - [bold green]Launching {first.Name}[/]");
6964

7065
var startInfo = new ProcessStartInfo
7166
{

Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static ServiceCollection SetupIoC()
4747
services.AddSingleton<ChromeBookmarks>();
4848
services.AddSingleton<MarkdownBookmarks>();
4949
services.AddSingleton<HtmlBookmarks>();
50+
services.AddSingleton<BookmarkAggregator>();
5051
services.AddSingleton<TinyCitySettings>(settings);
5152

5253
return services;

0 commit comments

Comments
 (0)