diff --git a/.gitignore b/.gitignore index f224fad..f2e73b1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,9 @@ /vendor # Web archive -/web/miniflux-archive -/web/preview.html +/web/archive # Gemini CLI state /.gemini/ -PROJECT.md \ No newline at end of file +PROJECT.md diff --git a/internal/app/app_test.go b/internal/app/app_test.go index 26581ce..86e4b13 100644 --- a/internal/app/app_test.go +++ b/internal/app/app_test.go @@ -39,7 +39,7 @@ func (m *mockMinifluxClientService) UpdateEntries(entryIDs []int64, status strin type mockDigestService struct{} -func (m *mockDigestService) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string) *models.OverviewTemplateData { +func (m *mockDigestService) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string, digestHost string) *models.OverviewTemplateData { return nil } diff --git a/internal/app/services/digest.go b/internal/app/services/digest.go index 05229d2..4c45f83 100644 --- a/internal/app/services/digest.go +++ b/internal/app/services/digest.go @@ -5,5 +5,5 @@ import ( ) type DigestService interface { - BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string) *models.OverviewTemplateData + BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string, digestHost string) *models.OverviewTemplateData } diff --git a/internal/archive/archive.go b/internal/archive/archive.go index a158d20..905b4ba 100644 --- a/internal/archive/archive.go +++ b/internal/archive/archive.go @@ -46,7 +46,10 @@ func (s *ArchiveServiceImpl) minifyHTML(data []byte, compress bool) ([]byte, err } m := minify.New() - m.AddFunc("text/html", html.Minify) + m.Add("text/html", &html.Minifier{ + KeepDocumentTags: true, + KeepEndTags: true, + }) return m.Bytes("text/html", data) } @@ -129,6 +132,7 @@ func (s *ArchiveServiceImpl) MakeArchiveHTML(data *models.OverviewTemplateData, MinifluxHost: data.MinifluxHost, GeneratedDate: data.GeneratedDate, TotalEntries: totalEntriesInPrimaryGroup, + DigestHost: data.DigestHost, } groupedEntriesFile, err := s.makeGroupedEntriesArchiveFile(primaryGroup, dateFolderPath) if err != nil { diff --git a/internal/config/config.go b/internal/config/config.go index 2a65344..27f1a0e 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -118,6 +118,7 @@ func setDefaultValues(k *koanf.Koanf) error { return k.Load(confmap.Provider(map[string]any{ "digest.compress": true, "digest.view": "date", + "digest.host": "http://localhost:8080", "digest.schedule": "@weekly", "digest.mark_as_read": true, "digest.run_on_startup": false, diff --git a/internal/digest/digest.go b/internal/digest/digest.go index 12ffe9c..3ab30af 100644 --- a/internal/digest/digest.go +++ b/internal/digest/digest.go @@ -14,6 +14,6 @@ type digestServiceImpl struct { llmService services.LLMService } -func (s *digestServiceImpl) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, viewType string, minifluxHost string) *models.OverviewTemplateData { - return view.BuildDigestDataForView(entries, icons, viewType, minifluxHost, s.llmService) +func (s *digestServiceImpl) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, viewType string, minifluxHost string, digestHost string) *models.OverviewTemplateData { + return view.BuildDigestDataForView(entries, icons, viewType, minifluxHost, digestHost, s.llmService) } \ No newline at end of file diff --git a/internal/digest/digest_test.go b/internal/digest/digest_test.go index bc27d2c..b88f163 100644 --- a/internal/digest/digest_test.go +++ b/internal/digest/digest_test.go @@ -71,7 +71,7 @@ func TestDigestService_BuildDigestData(t *testing.T) { } t.Run("view=date", func(t *testing.T) { - overviewData := digestService.BuildDigestData(entries, icons, "date", "http://miniflux.test") + overviewData := digestService.BuildDigestData(entries, icons, "date", "http://miniflux.test", "") if overviewData == nil { t.Fatal("overviewData is nil") } @@ -94,7 +94,7 @@ func TestDigestService_BuildDigestData(t *testing.T) { }) t.Run("view=category", func(t *testing.T) { - overviewData := digestService.BuildDigestData(entries, icons, "category", "http://miniflux.test") + overviewData := digestService.BuildDigestData(entries, icons, "category", "http://miniflux.test", "") if overviewData == nil { t.Fatal("overviewData is nil") } @@ -115,7 +115,7 @@ func TestDigestService_BuildDigestData(t *testing.T) { t.Run("view=ai", func(t *testing.T) { aiEntries := createLLMGrouperMockEntries() - overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test") + overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test", "") if overviewData == nil { t.Fatal("overviewData is nil") } @@ -138,7 +138,7 @@ func TestDigestService_BuildDigestData(t *testing.T) { } digestService := NewDigestService(mockLLM) aiEntries := createLLMGrouperMockEntries() - overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test") + overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test", "") if overviewData == nil { t.Fatal("overviewData is nil") @@ -176,7 +176,7 @@ func TestDigestService_BuildDigestData(t *testing.T) { } digestService := NewDigestService(mockLLM) aiEntries := createLLMGrouperMockEntries() - overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test") + overviewData := digestService.BuildDigestData(aiEntries, icons, "ai", "http://miniflux.test", "") if overviewData == nil { t.Fatal("overviewData is nil") diff --git a/internal/digest/view/view.go b/internal/digest/view/view.go index 8d22beb..47f3171 100644 --- a/internal/digest/view/view.go +++ b/internal/digest/view/view.go @@ -8,7 +8,7 @@ import ( "time" ) -func BuildDigestDataForView(entries []*models.Entry, icons map[int64]*models.FeedIcon, viewType string, minifluxHost string, llmService services.LLMService) *models.OverviewTemplateData { +func BuildDigestDataForView(entries []*models.Entry, icons map[int64]*models.FeedIcon, viewType string, minifluxHost string, digestHost string, llmService services.LLMService) *models.OverviewTemplateData { iconsSlice := make([]*models.FeedIcon, 0, len(icons)) for _, icon := range icons { iconsSlice = append(iconsSlice, icon) @@ -69,6 +69,7 @@ func BuildDigestDataForView(entries []*models.Entry, icons map[int64]*models.Fee TotalEntries: len(entries), TotalFeeds: len(uniqueFeedIDs), MinifluxHost: minifluxHost, + DigestHost: digestHost, } } diff --git a/internal/models/models.go b/internal/models/models.go index 7b5018e..64e1dc7 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -49,6 +49,7 @@ type OverviewTemplateData struct { TotalEntries int TotalFeeds int MinifluxHost string + DigestHost string } type EntryGroup struct { @@ -93,4 +94,5 @@ type GroupedDigestPageData struct { GeneratedDate time.Time TotalEntries int TotalFeeds int -} + DigestHost string +} \ No newline at end of file diff --git a/internal/processor/processor.go b/internal/processor/processor.go index 77cb4ad..da7d266 100644 --- a/internal/processor/processor.go +++ b/internal/processor/processor.go @@ -37,6 +37,7 @@ func ProcessDigest(application *app.App) (*os.File, []*os.File, *models.Overview icons, application.Config.Digest.View, application.Config.Miniflux.Host, + application.Config.Digest.Host, ) overviewFile, groupedEntryFiles, err := application.ArchiveService.MakeArchiveHTML(data, application.Config.Digest.Compress) diff --git a/internal/processor/processor_test.go b/internal/processor/processor_test.go index 895fccd..3c6399b 100644 --- a/internal/processor/processor_test.go +++ b/internal/processor/processor_test.go @@ -30,11 +30,11 @@ func (m *mockMinifluxClientService) UpdateEntries(entryIDs []int64, status strin } type mockDigestService struct { - buildDigestDataFunc func(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string) *models.OverviewTemplateData + buildDigestDataFunc func(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string, digestHost string) *models.OverviewTemplateData } -func (m *mockDigestService) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string) *models.OverviewTemplateData { - return m.buildDigestDataFunc(entries, icons, view, minifluxHost) +func (m *mockDigestService) BuildDigestData(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string, digestHost string) *models.OverviewTemplateData { + return m.buildDigestDataFunc(entries, icons, view, minifluxHost, digestHost) } type mockArchiveService struct { @@ -78,7 +78,7 @@ func TestProcessDigest_Success(t *testing.T) { }, } mockDigestService := &mockDigestService{ - buildDigestDataFunc: func(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string) *models.OverviewTemplateData { + buildDigestDataFunc: func(entries []*models.Entry, icons map[int64]*models.FeedIcon, view string, minifluxHost string, digestHost string) *models.OverviewTemplateData { return expectedOverviewData }, } diff --git a/internal/templates/grouped-entries.gohtml b/internal/templates/grouped-entries.gohtml index 58b5709..d4df502 100644 --- a/internal/templates/grouped-entries.gohtml +++ b/internal/templates/grouped-entries.gohtml @@ -5,6 +5,11 @@