···7788 "github.com/bluesky-social/indigo/atproto/syntax"
99 securejoin "github.com/cyphar/filepath-securejoin"
1010+ enry "github.com/go-enry/go-enry/v2"
1011 "tangled.org/core/api/tangled"
1112)
1213···112113 IssueCount IssueCount
113114 PullCount PullCount
114115 ForkCount int
116116+}
117117+118118+// returns the first file extension for the language ("ts" for typescript) as
119119+// an uppercase string
120120+func (s *RepoStats) LangShortName() string {
121121+ if s == nil || s.Language == "" {
122122+ return ""
123123+ }
124124+ exts := enry.GetLanguageExtensions(s.Language)
125125+ if len(exts) > 0 {
126126+ // extensions include the leading dot, e.g. ".ts" -> "TS"
127127+ return strings.ToUpper(strings.TrimPrefix(exts[0], "."))
128128+ }
129129+ return s.Language
115130}
116131117132type IssueCount struct {
+1
appview/pages/pages.go
···407407 GfiLabel *models.LabelDefinition
408408 BlueskyPosts []models.BskyPost
409409 VouchSuggestions []models.VouchSuggestion
410410+ Notifications []*models.NotificationWithEntity
410411 // ShowNewsletter controls whether the newsletter widget/CTA is rendered.
411412 // For logged-in users it reflects their newsletter_preferences row; for
412413 // anonymous visitors it is always true (dismissal falls back to