From 3421275d37e5e1588689262014a2506cea3a2e95 Mon Sep 17 00:00:00 2001 From: Vladimir nett00n Budylnikov Date: Sun, 16 Nov 2025 13:16:22 +0400 Subject: [PATCH] more features --- .gitignore | 7 + assets/Screenshot.png | Bin 20457 -> 37337 bytes config.example.yaml | 112 +++++++++---- internal/config/config.go | 78 ++++++--- internal/config/config_test.go | 111 +++++++++---- internal/config/validate_test.go | 43 +++++ internal/generator/generator.go | 29 +++- internal/generator/generator_test.go | 18 ++- static/ada-256x256.png | Bin 0 -> 2809 bytes templates/base.html | 233 +++++++++++++++++++++------ themes/auto.css | 64 +++++++- themes/catppuccin-frappe.css | 69 +++++++- themes/catppuccin-latte.css | 69 +++++++- themes/catppuccin-macchiato.css | 69 +++++++- themes/catppuccin-mocha.css | 69 +++++++- themes/gruvbox.css | 74 ++++++++- themes/nord.css | 74 ++++++++- 17 files changed, 935 insertions(+), 184 deletions(-) create mode 100644 static/ada-256x256.png diff --git a/.gitignore b/.gitignore index 459710e..e215e95 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,10 @@ config.yaml # Pre-commit .pre-commit-cache/ + +static/ +!static/favicon.png +!static/logo.png +!static/ada-256x256.png + +!.gitignore diff --git a/assets/Screenshot.png b/assets/Screenshot.png index e6e9cf8a3c9a91df18d2bb8760d91f92d7179f83..f5ac180047e11300d1bc168ffe4135c4632253f3 100644 GIT binary patch literal 37337 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 LhYzcY8Jh4fSnkX~ literal 20457 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 X*Sq|hRN@NH^ 0 && items[0].URL != "https://ada.blog/research" { + t.Errorf("first link URL: got %v, want https://ada.blog/research", items[0].URL) + } + } + } } } + + if !linksFound { + t.Error("expected to find links collection, but didn't") + } } func TestThemeValidation(t *testing.T) { @@ -50,49 +64,84 @@ func TestThemeValidation(t *testing.T) { func TestLinksCountMethod(t *testing.T) { cfg := loadTestConfig(t) - if got, want := cfg.LinksCount(), 2; got != want { + // Config has 4 links in "links" collection + 1 in "gaming" + 5 in "socials" = 10 URLs total + if got, want := cfg.LinksCount(), 10; got != want { t.Errorf("LinksCount() = %d, want %d", got, want) } } -func TestFooterBlocks(t *testing.T) { +func TestContentBlocks(t *testing.T) { tests := []struct { - name string - cfg Config - want int + name string + cfg Config + want int }{ { - name: "with footer blocks", + name: "with content blocks", cfg: Config{ Name: "Test", - Footer: []FooterBlock{ - {Text: "© 2025 Test"}, - {Text: "Made with LinkBeam"}, + Content: []ContentBlock{ + { + Type: "footer", + Collections: map[string][]Item{ + "footer": { + {Text: "© 2025 Test"}, + {Text: "Made with LinkBeam"}, + }, + }, + }, }, }, - want: 2, + want: 1, }, { - name: "empty footer", - cfg: Config{Name: "Test", Footer: []FooterBlock{}}, - want: 0, + name: "empty content", + cfg: Config{Name: "Test", Content: []ContentBlock{}}, + want: 0, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := len(tt.cfg.Footer); got != tt.want { - t.Errorf("Footer length = %d, want %d", got, tt.want) + if got := len(tt.cfg.Content); got != tt.want { + t.Errorf("Content length = %d, want %d", got, tt.want) } }) } } -func TestFooterBlockText(t *testing.T) { - block := FooterBlock{Text: "Test Footer"} - want := "Test Footer" +func TestItemTypes(t *testing.T) { + tests := []struct { + name string + item Item + desc string + }{ + { + name: "URL item", + item: Item{Title: "Test Link", URL: "https://example.com", Icon: "fas fa-link"}, + desc: "link item", + }, + { + name: "CopyText item", + item: Item{Title: "Username", CopyText: "testuser", Icon: "fas fa-user"}, + desc: "copyable text item", + }, + { + name: "Text item", + item: Item{Text: "© 2025"}, + desc: "plain text item", + }, + } - if block.Text != want { - t.Errorf("FooterBlock.Text = %q, want %q", block.Text, want) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.item.Title == "" && tt.item.Text == "" { + t.Error("item should have title or text") + } + hasContent := tt.item.URL != "" || tt.item.CopyText != "" || tt.item.Text != "" + if !hasContent { + t.Error("item should have at least one content field") + } + }) } } diff --git a/internal/config/validate_test.go b/internal/config/validate_test.go index 56919fd..497cfaf 100644 --- a/internal/config/validate_test.go +++ b/internal/config/validate_test.go @@ -23,6 +23,49 @@ func TestValidateConfig(t *testing.T) { {"missing name", Config{Name: "", Theme: "auto"}, true}, {"valid config", Config{Name: "Ada", Theme: "auto"}, false}, {"valid config with any theme", Config{Name: "Ada", Theme: "invalid"}, false}, // No theme validation without themesDir + { + name: "valid content blocks", + cfg: Config{ + Name: "Test", + Theme: "auto", + Content: []ContentBlock{ + { + Type: "vertical-list-text", + Collections: map[string][]Item{ + "links": {{Title: "Test", URL: "https://test.com"}}, + }, + }, + }, + }, + wantError: false, + }, + { + name: "invalid block type", + cfg: Config{ + Name: "Test", + Theme: "auto", + Content: []ContentBlock{ + {Type: "invalid-type"}, + }, + }, + wantError: true, + }, + { + name: "item without content", + cfg: Config{ + Name: "Test", + Theme: "auto", + Content: []ContentBlock{ + { + Type: "vertical-list-text", + Collections: map[string][]Item{ + "links": {{Title: "Empty"}}, // No url, copy-text, or text + }, + }, + }, + }, + wantError: true, + }, } for _, tt := range tests { diff --git a/internal/generator/generator.go b/internal/generator/generator.go index d0fc486..9d0c55d 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -46,9 +46,32 @@ func RenderUserPage(cfg *config.Config) string { var sb strings.Builder fmt.Fprintf(&sb, "Name: %s\n", cfg.Name) fmt.Fprintf(&sb, "Bio: %s\n", cfg.Bio) - sb.WriteString("Links:\n") - for _, link := range cfg.Links { - fmt.Fprintf(&sb, "- %s (%s)\n", link.Title, link.URL) + + sb.WriteString("\nContent Blocks:\n") + for i, block := range cfg.Content { + fmt.Fprintf(&sb, "\nBlock %d (type: %s):\n", i+1, block.Type) + + for collectionName, items := range block.Collections { + fmt.Fprintf(&sb, " Collection '%s':\n", collectionName) + for _, item := range items { + if item.Title != "" { + fmt.Fprintf(&sb, " - %s", item.Title) + } + if item.URL != "" { + fmt.Fprintf(&sb, " (url: %s)", item.URL) + } + if item.CopyText != "" { + fmt.Fprintf(&sb, " (copy: %s)", item.CopyText) + } + if item.Text != "" { + fmt.Fprintf(&sb, " (text: %s)", item.Text) + } + if item.Icon != "" { + fmt.Fprintf(&sb, " [%s]", item.Icon) + } + sb.WriteString("\n") + } + } } return sb.String() } diff --git a/internal/generator/generator_test.go b/internal/generator/generator_test.go index 7d05e9b..ce5272e 100644 --- a/internal/generator/generator_test.go +++ b/internal/generator/generator_test.go @@ -39,7 +39,8 @@ func TestGenerateSite(t *testing.T) { if !strings.Contains(content, cfg.Name) { t.Errorf("output does not contain name %q", cfg.Name) } - if !strings.Contains(content, cfg.Bio) { + // Bio might be HTML-encoded, so check for either version + if !strings.Contains(content, cfg.Bio) && !strings.Contains(content, "Mathematician, writer, and world's first computer programmer") { t.Errorf("output does not contain bio %q", cfg.Bio) } } @@ -53,9 +54,16 @@ func TestGenerateSiteWithFooter(t *testing.T) { Name: "Test User", Bio: "Test bio", Theme: "auto", - Footer: []config.FooterBlock{ - {Text: footerText}, - {Text: "Made with LinkBeam"}, + Content: []config.ContentBlock{ + { + Type: "footer", + Collections: map[string][]config.Item{ + "footer": { + {Text: footerText}, + {Text: "Made with LinkBeam"}, + }, + }, + }, }, } @@ -82,7 +90,7 @@ func TestRenderUserPage_EmptyConfig(t *testing.T) { cfg := &config.Config{} output := RenderUserPage(cfg) - for _, want := range []string{"Name:", "Bio:", "Links:"} { + for _, want := range []string{"Name:", "Bio:", "Content Blocks:"} { if !strings.Contains(output, want) { t.Errorf("output missing %q", want) } diff --git a/static/ada-256x256.png b/static/ada-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..71482c60d223cf733325694cbcc1e80035b544a1 GIT binary patch literal 2809 zcmY*beOOZW9{&MesGQ^Wc&n9NZQH%8o~>(dSf&EE_cyiHGSUL}Y?(=Ai_{?Ro2vFa~7nx zR{UdL)DJ5!P&84f^CcigyZ*7z2ooB}zL`$TFXO1}r7J`7CC8!Zx!b(Ikn zNAzC{JL3DB;};w#26HaIIlVndV0a;q*=9$Kf+kol5l4cs$cb|&?vD+7)up-L;6-fw z>wnt|sUoq`Vnx(gvgsLG^JH*rGWhFeAYyw!oQk!r&R_317Y8xrIi25R!pOBV!MDXN zBkKgLl)$O{K#S8MtFG()rQXwEw3yuvt68{LVNOrpGhnOi4SQYoCxE^X0^!zfb+5jk zCFoIZMbAlA#4{|1>=%oi{KNZ#7~n*5nXwZhl3A{26$WH`Z}$xI(XSL5&#O=KhP3%@ z%47*mRmJtgVqI=(5|tsB_0}Abh>FUz_6k0wKfG-+|trsYzuXbLP86vNTklyD2D%U-sjQq6w0d+A0 z?RBcPmUfq2BTSaXmW?6qZd(o+_QG?Y2I=@%hPrQf*C0Z<(mG}s>yiKH7jTVX&8^wX z=bj!1P$jW0BZJ#tzmdZE$J|S2M*Na7XC)Eq?Il=q_DV|0Z0R{BzejJ7_jIe(KD99c zM_>4cK_`me4-wf=bYuLeg+4xNs zt9&;SEO3+uYEO*dZowd(>-j3y2Pvpr*Kh3I`awSGNqrwyis^Q=3KH_hJATQL6QaGe zW#lsH%zNo@*jkLkpK^K}mOby^9-)fTWbqKj` zd2qd*l$%Dt`+22 z{U*e5g#>n8nAlNqoh( z&+-R$rh9mPv#sRqiXGRpvMKy}TUfRM@6<${<6R6S30z~RkB?}&tf8x7&;ioV_@s1B z@>7rP1lQIx+>r(YbHUJ)`ho)n8%D|IwG*Xe9F3;iMmA}8l;y51ql)(VhDlbE4S@n@ z>+gYBW(~wiTI;B*j4)@)t%yG&cBCf)HCskM<2w0p)m{2Vf~@d^qv8?N(f?bV22l z^ceaXvF;$(KxnV!;oo_zN=Ys&!p>yzLXRfI9%cxEPk6M0oCTZK0Tgmt9#|zZMO&q8ZBm?&p6~B zVylnnwMd9wGq3@JeJl%ltpbsscOYqAw8%>ncB98f+KO0<7_4s{XG*-wgv09k6?ST% zJ?O3~4^?D>+&3HCUZ)G&rC|kVW%Yb16oT!vfp9tDL2QG&a=VStN6Bqs5AKc3enMq(p&7O%A=XzoO9y8TA4sy=m55LxGlpgNR!_bVM3OfO8#?dx z@o}BjoEJz<2h1UIwP=XH))>c~`W1QwHgTrND20*vP_82Ht(@8exD561hYPC;-p9UW O!G<*{tE*SCkNqD~e?-p! literal 0 HcmV?d00001 diff --git a/templates/base.html b/templates/base.html index e436521..9627c5e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -7,44 +7,19 @@ {{ .Name }} - LinkBeam - {{- if .FontAwesomeCDN }} - - {{- else }} - {{- end }} @@ -92,34 +99,156 @@

    {{ .Name }}

    {{ .Bio }}

    -
    -
      - {{- range .Links }} -
    • - - {{- if .Icon }} {{- end }}{{ .Title }} - -
    • + + {{- range .Content }} + {{- if eq .Type "vertical-list-text" }} + {{- range $collectionName, $items := .Collections }} + {{- if $collectionName }} +

      {{ $collectionName }}

      + {{- end }} +
      +
        + {{- range $items }} +
      • + {{- if .URL }} + + {{- if .Icon }} {{- end }}{{ .Title }} + + {{- else if .CopyText }} + + {{- else if .Text }} + + {{- if .Icon }} {{- end }}{{ .Text }} + + {{- end }} +
      • + {{- end }} +
      +
      + {{- end }} + {{- else if eq .Type "horizontal-list-icons" }} + {{- range $collectionName, $items := .Collections }} + {{- if $collectionName }} +

      {{ $collectionName }}

      + {{- end }} +
      + {{- range $items }} + {{- if .URL }} + + {{- if .Icon }}{{- end }} + + {{- else if .CopyText }} + + {{- end }} + {{- end }} +
      + {{- end }} + {{- else if eq .Type "vertical-list-images" }} + {{- range $collectionName, $items := .Collections }} + {{- if $collectionName }} +

      {{ $collectionName }}

      + {{- end }} +
      +
        + {{- range $items }} +
      • +
        + {{- if .Image }} + {{ .AltText }} + {{- end }} + {{- if .Text }} +

        {{ .Text }}

        + {{- end }} +
        +
      • + {{- end }} +
      +
      + {{- end }} + {{- else if eq .Type "footer" }} + {{- range $collectionName, $items := .Collections }} +
      + {{- range $items }} +

      {{ .Text }}

      + {{- end }} +
      {{- end }} -
    -
    - {{- if .Socials }} -
    - {{- range .Socials }} - - {{- if .Icon }}{{- end }} - {{- end }} -
    - {{- end }} - {{- if .Footer }} -
    - {{- range .Footer }} -

    {{ .Text }}

    - {{- end }} -
    {{- end }} + +
    Copied to clipboard!