diff --git a/modules/markup/html.go b/modules/markup/html.go
index 7961c5c930..aba287e0fd 100644
--- a/modules/markup/html.go
+++ b/modules/markup/html.go
@@ -1142,7 +1142,7 @@ func emojiShortCodeProcessor(ctx *RenderContext, node *html.Node) {
converted := emoji.FromAlias(alias)
if converted == nil {
// check if this is a custom reaction
- if _, exist := setting.UI.CustomEmojisMap[alias]; exist {
+ if setting.UI.CustomEmojisLookup.Contains(alias) {
replaceContent(node, m[0], m[1], createCustomEmoji(alias))
node = node.NextSibling.NextSibling
start = 0
diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go
index 6bc0f7e56c..22c7e4ca5d 100644
--- a/modules/markup/html_test.go
+++ b/modules/markup/html_test.go
@@ -358,7 +358,7 @@ func TestRender_emoji(t *testing.T) {
test(
":custom-emoji:",
`
:custom-emoji:
`)
- setting.UI.CustomEmojisMap["custom-emoji"] = ":custom-emoji:"
+ setting.UI.CustomEmojisLookup.Add("custom-emoji")
test(
":custom-emoji:",
`
`)
diff --git a/modules/setting/ui.go b/modules/setting/ui.go
index 2e6a3df4c6..9dafe350eb 100644
--- a/modules/setting/ui.go
+++ b/modules/setting/ui.go
@@ -31,7 +31,7 @@ var UI = struct {
Reactions []string
ReactionsLookup container.Set[string] `ini:"-"`
CustomEmojis []string
- CustomEmojisMap map[string]string `ini:"-"`
+ CustomEmojisLookup container.Set[string] `ini:"-"`
SearchRepoDescription bool
OnlyShowRelevantRepos bool
ExploreDefaultSort string `ini:"EXPLORE_PAGING_DEFAULT_SORT"`
@@ -87,7 +87,6 @@ var UI = struct {
Themes: []string{`forgejo-auto`, `forgejo-light`, `forgejo-dark`, `gitea-auto`, `gitea-light`, `gitea-dark`, `forgejo-auto-deuteranopia-protanopia`, `forgejo-light-deuteranopia-protanopia`, `forgejo-dark-deuteranopia-protanopia`, `forgejo-auto-tritanopia`, `forgejo-light-tritanopia`, `forgejo-dark-tritanopia`},
Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
- CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
ExploreDefaultSort: "recentupdate",
PreferredTimestampTense: "mixed",
@@ -163,8 +162,6 @@ func loadUIFrom(rootCfg ConfigProvider) {
for _, reaction := range UI.Reactions {
UI.ReactionsLookup.Add(reaction)
}
- UI.CustomEmojisMap = make(map[string]string)
- for _, emoji := range UI.CustomEmojis {
- UI.CustomEmojisMap[emoji] = ":" + emoji + ":"
- }
+ UI.CustomEmojisLookup = make(container.Set[string])
+ UI.CustomEmojisLookup.AddMultiple(UI.CustomEmojis...)
}
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index 42b4bad83c..8518290da0 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -128,8 +128,8 @@ func NewFuncMap() template.FuncMap {
"AllowedReactions": func() []string {
return setting.UI.Reactions
},
- "CustomEmojis": func() map[string]string {
- return setting.UI.CustomEmojisMap
+ "CustomEmojis": func() []string {
+ return setting.UI.CustomEmojis
},
"MetaAuthor": func() string {
return setting.UI.Meta.Author
diff --git a/templates/base/head_script.tmpl b/templates/base/head_script.tmpl
index d2774010b6..4bc274a73f 100644
--- a/templates/base/head_script.tmpl
+++ b/templates/base/head_script.tmpl
@@ -13,7 +13,7 @@ If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly.
assetVersionEncoded: encodeURIComponent('{{AssetVersion}}'), // will be used in URL construction directly
assetUrlPrefix: '{{AssetUrlPrefix}}',
runModeIsProd: {{.RunModeIsProd}},
- customEmojis: {{CustomEmojis}},
+ customEmojis: new Set({{CustomEmojis}}),
csrfToken: '{{.CsrfToken}}',
pageData: {{.PageData}},
notificationSettings: {{NotificationSettings}}, {{/*a map provided by NewFuncMap in helper.go*/}}
diff --git a/web_src/js/features/emoji.js b/web_src/js/features/emoji.js
index 032a3efe8a..76555bfe05 100644
--- a/web_src/js/features/emoji.js
+++ b/web_src/js/features/emoji.js
@@ -2,7 +2,7 @@ import emojis from '../../../assets/emoji.json';
const {assetUrlPrefix, customEmojis} = window.config;
-const tempMap = {...customEmojis};
+const tempMap = Object.assign(...Array.from(customEmojis, (v) => ({[v]: `:${v}:`})));
for (const {emoji, aliases} of emojis) {
for (const alias of aliases || []) {
tempMap[alias] = emoji;
@@ -23,7 +23,7 @@ for (const key of emojiKeys) {
// retrieve HTML for given emoji name
export function emojiHTML(name) {
let inner;
- if (Object.hasOwn(customEmojis, name)) {
+ if (customEmojis.has(name)) {
inner = `
`;
} else {
inner = emojiString(name);