More OG stuff

wip
Carsten Kragelund Jørgensen 2023-05-03 14:13:04 +00:00 committed by Carsten Kragelund
parent b6fafb67d5
commit 3784a7d2f5
4 changed files with 67 additions and 18 deletions

@ -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
}

@ -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 {

@ -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)

@ -38,14 +38,18 @@
<meta property="og:description" content="{{.ContextUser.Description}}">
{{end}}
{{else if .PageIsViewCode }}
<meta property="og:title" content="{{.Repository.Name}}">
<meta property="og:url" content="{{.Repository.HTMLURL}}">
<meta name="twitter:card" content="summary_large_card">
{{if .Repository.Description}}
<meta property="og:description" content="{{.Repository.Description}}">
{{end}}
<meta name="twitter:image:src" content="{{.OgImage}}">
<meta name="twitter:site" content="@gitea">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{.Repository.Name}}">
<meta name="twitter:description" content="{{.Repository.Description}}">
<meta property="og:image" content="{{.OgImage}}">
<meta property="og:image:alt" content="{{.Repository.Description}}">
<meta property="og:site_name" content="{{AppName}}">
<meta property="og:type" content="object">
<meta property="og:title" content="{{.Repository.Name}}">
<meta property="og:url" content="{{.Repository.HTMLURL}}">
<meta property="og:description" content="{{.Repository.Description}}">
{{else if .Repository}}
{{if .Issue}}
<meta property="og:title" content="{{.Issue.Title}}">