From b3ddcbda76703b2a8f9e3f3bc16fcdf939bc78ad Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Tue, 5 Aug 2025 23:06:16 +0100 Subject: [PATCH] appview/pages: add templates to render strings Change-Id: tlrppkxrmplnvtlnrnwxvytwuwxqsnvs Signed-off-by: oppiliappan --- appview/pages/pages.go | 74 ++++++++++++++++++ appview/pages/templates/strings/string.html | 85 +++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 appview/pages/templates/strings/string.html diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 2608c0f..00dfaf8 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -31,6 +31,7 @@ import ( chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/alecthomas/chroma/v2/lexers" "github.com/alecthomas/chroma/v2/styles" + "github.com/bluesky-social/indigo/atproto/identity" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" @@ -1144,6 +1145,79 @@ func (p *Pages) Workflow(w io.Writer, params WorkflowParams) error { return p.executeRepo("repo/pipelines/workflow", w, params) } +type PutStringParams struct { + LoggedInUser *oauth.User + Action string + + // this is supplied in the case of editing an existing string + String db.String +} + +func (p *Pages) PutString(w io.Writer, params PutStringParams) error { + return p.execute("strings/put", w, params) +} + +type StringsDashboardParams struct { + LoggedInUser *oauth.User + Card ProfileCard + Strings []db.String +} + +func (p *Pages) StringsDashboard(w io.Writer, params StringsDashboardParams) error { + return p.execute("strings/dashboard", w, params) +} + +type SingleStringParams struct { + LoggedInUser *oauth.User + ShowRendered bool + RenderToggle bool + RenderedContents template.HTML + String db.String + Stats db.StringStats + Owner identity.Identity +} + +func (p *Pages) SingleString(w io.Writer, params SingleStringParams) error { + var style *chroma.Style = styles.Get("catpuccin-latte") + + if params.ShowRendered { + switch markup.GetFormat(params.String.Filename) { + case markup.FormatMarkdown: + p.rctx.RendererType = markup.RendererTypeDefault + htmlString := p.rctx.RenderMarkdown(params.String.Contents) + params.RenderedContents = template.HTML(p.rctx.Sanitize(htmlString)) + } + } + + c := params.String.Contents + formatter := chromahtml.New( + chromahtml.InlineCode(false), + chromahtml.WithLineNumbers(true), + chromahtml.WithLinkableLineNumbers(true, "L"), + chromahtml.Standalone(false), + chromahtml.WithClasses(true), + ) + + lexer := lexers.Get(filepath.Base(params.String.Filename)) + if lexer == nil { + lexer = lexers.Fallback + } + + iterator, err := lexer.Tokenise(nil, c) + if err != nil { + return fmt.Errorf("chroma tokenize: %w", err) + } + + var code bytes.Buffer + err = formatter.Format(&code, style, iterator) + if err != nil { + return fmt.Errorf("chroma format: %w", err) + } + + params.String.Contents = code.String() + return p.execute("strings/string", w, params) +} + func (p *Pages) Static() http.Handler { if p.dev { return http.StripPrefix("/static/", http.FileServer(http.Dir("appview/pages/static"))) diff --git a/appview/pages/templates/strings/string.html b/appview/pages/templates/strings/string.html new file mode 100644 index 0000000..239b082 --- /dev/null +++ b/appview/pages/templates/strings/string.html @@ -0,0 +1,85 @@ +{{ define "title" }}{{ .String.Filename }} · by {{ didOrHandle .Owner.DID.String .Owner.Handle.String }}{{ end }} + +{{ define "extrameta" }} + {{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }} + + + + +{{ end }} + +{{ define "topbar" }} + {{ template "layouts/topbar" $ }} +{{ end }} + +{{ define "content" }} +{{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }} +
+
+
+ {{ $ownerId }} + / + {{ .String.Filename }} +
+ {{ if and .LoggedInUser (eq .LoggedInUser.Did .String.Did) }} +
+ + {{ i "pencil" "size-4" }} + + {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} + + +
+ {{ end }} +
+ + {{ with .String.Description }} + {{ . }} + + {{ end }} + + {{ with .String.Edited }} + edited {{ template "repo/fragments/shortTimeAgo" . }} + {{ else }} + {{ template "repo/fragments/shortTimeAgo" .String.Created }} + {{ end }} + +
+
+
+ {{ .String.Filename }} +
+ {{ .Stats.LineCount }} lines + + {{ byteFmt .Stats.ByteCount }} + + view raw + {{ if .RenderToggle }} + + + view {{ if .ShowRendered }}code{{ else }}rendered{{ end }} + + {{ end }} +
+
+
+ {{ if .ShowRendered }} +
{{ .RenderedContents }}
+ {{ else }} +
{{ .String.Contents | escapeHtml }}
+ {{ end }} +
+
+{{ end }} -- 2.43.0