diff --git a/modules/codeimage/image/image.go b/modules/codeimage/image/image.go index 8140829f6..77648db77 100644 --- a/modules/codeimage/image/image.go +++ b/modules/codeimage/image/image.go @@ -2,7 +2,6 @@ package image import ( "bytes" - "encoding/base64" "image/color" "strings" @@ -10,7 +9,7 @@ import ( "github.com/jiro4989/textimg/v3/token" ) -func Draw(tokens token.Tokens) (string, error) { +func Draw(tokens token.Tokens) ([]byte, error) { foreground := color.RGBA{205, 214, 244, 255} background := color.RGBA{30, 30, 46, 255} @@ -19,7 +18,7 @@ func Draw(tokens token.Tokens) (string, error) { bgCol := background dc.SetColor(bgCol) if err := dc.LoadFontFace("fonts/FiraCode-Regular.ttf", 14); err != nil { - return "", err + return nil, err } dc.Clear() curX, curY := 0.0, 0.0 @@ -57,5 +56,5 @@ func Draw(tokens token.Tokens) (string, error) { } buffer := new(bytes.Buffer) dc.EncodePNG(buffer) - return "data:image/png;base64," + base64.StdEncoding.EncodeToString(buffer.Bytes()), nil + return buffer.Bytes(), nil } diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 39347545d..8172b5188 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -518,15 +518,11 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st status = status.Or(statuses[i]) } - ansiContent, _, _ := highlight.AnsiFile(blob.Name(), language, buf) - log.Info("%s", ansiContent[0]) - tks, _ := parser.Parse(strings.Join(ansiContent, "")) - imgStr, err := image.Draw(tks) - if err != nil { - log.Error("Drawing image failed: %v", err) + ogImg := ctx.Repo.Repository.HTMLURL() + "/src/og/" + ctx.Repo.BranchName + if len(ctx.Repo.TreePath) > 0 { + ogImg += "/" + util.PathEscapeSegments(ctx.Repo.TreePath) } - - ctx.Data["OgImage"] = imgStr + ctx.Data["OgImage"] = ogImg ctx.Data["EscapeStatus"] = status ctx.Data["FileContent"] = fileContent ctx.Data["LineEscapeStatus"] = statuses @@ -717,6 +713,55 @@ func checkCitationFile(ctx *context.Context, entry *git.TreeEntry) { } } +func OgImage(ctx *context.Context) { + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + if err != nil { + log.Error("%v", err) + return + } + blob := entry.Blob() + buf, dataRc, _, err := getFileReader(ctx.Repo.Repository.ID, blob) + if err != nil { + ctx.ServerError("getFileReader", err) + return + } + defer dataRc.Close() + + language := "" + indexFilename, worktree, deleteTemporaryFile, err := ctx.Repo.GitRepo.ReadTreeToTemporaryIndex(ctx.Repo.CommitID) + if err == nil { + defer deleteTemporaryFile() + filename2attribute2info, err := ctx.Repo.GitRepo.CheckAttribute(git.CheckAttributeOpts{ + CachedOnly: true, + Attributes: []string{"linguist-language", "gitlab-language"}, + Filenames: []string{ctx.Repo.TreePath}, + IndexFile: indexFilename, + WorkTree: worktree, + }) + if err != nil { + log.Error("Unable to load attributes for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) + } + + language = filename2attribute2info[ctx.Repo.TreePath]["linguist-language"] + if language == "" || language == "unspecified" { + language = filename2attribute2info[ctx.Repo.TreePath]["gitlab-language"] + } + if language == "unspecified" { + language = "" + } + } + + ansiContent, _, _ := highlight.AnsiFile(blob.Name(), language, buf) + log.Info("%s", ansiContent[0]) + tks, _ := parser.Parse(strings.Join(ansiContent, "")) + img, err := image.Draw(tks) + if err != nil { + log.Error("Drawing image failed: %v", err) + } + + ctx.Write(img) +} + // Home render repository home page func Home(ctx *context.Context) { if setting.Other.EnableFeed { diff --git a/routers/web/web.go b/routers/web/web.go index 5357c5550..c1741dd5a 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1324,6 +1324,7 @@ func registerRoutes(m *web.Route) { m.Get("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.Home) m.Get("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.Home) m.Get("/commit/*", context.RepoRefByType(context.RepoRefCommit), repo.Home) + m.Get("/og/*", context.RepoRefByType(context.RepoRefBranch), repo.OgImage) // "/*" route is deprecated, and kept for backward compatibility m.Get("/*", context.RepoRefByType(context.RepoRefLegacy), repo.Home) }, repo.SetEditorconfigIfExists) diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 33064780b..ff4e84e5b 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -38,14 +38,18 @@ {{end}} {{else if .PageIsViewCode }} - - - - {{if .Repository.Description}} - - {{end}} + + + + + + + + + + {{else if .Repository}} {{if .Issue}}