mirror of
https://github.com/go-gitea/gitea.git
synced 2025-06-21 21:48:00 +02:00
Direct SVG rendering (#12157)
Introduce 'make svg' which calls a node script that compiles svg files to `public/img/svg`. These files are vendored to not create a dependency on Node for the backend build. On the frontend side, configure webpack using `raw-loader` so SVGs can be imported as string. Also moved our existing SVGs to web_src/svg for consistency. Fixes: https://github.com/go-gitea/gitea/issues/11618
This commit is contained in:
32
modules/svg/discover_bindata.go
Normal file
32
modules/svg/discover_bindata.go
Normal file
@ -0,0 +1,32 @@
|
||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build bindata
|
||||
|
||||
package svg
|
||||
|
||||
import (
|
||||
"path"
|
||||
"path/filepath"
|
||||
|
||||
"code.gitea.io/gitea/modules/public"
|
||||
)
|
||||
|
||||
// Discover returns a map of discovered SVG icons in bindata
|
||||
func Discover() map[string]string {
|
||||
svgs := make(map[string]string)
|
||||
|
||||
for _, file := range public.AssetNames() {
|
||||
matched, _ := filepath.Match("img/svg/*.svg", file)
|
||||
if matched {
|
||||
content, err := public.Asset(file)
|
||||
if err == nil {
|
||||
filename := path.Base(file)
|
||||
svgs[filename[:len(filename)-4]] = string(content)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return svgs
|
||||
}
|
31
modules/svg/discover_nobindata.go
Normal file
31
modules/svg/discover_nobindata.go
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !bindata
|
||||
|
||||
package svg
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"path"
|
||||
"path/filepath"
|
||||
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
)
|
||||
|
||||
// Discover returns a map of discovered SVG icons in the file system
|
||||
func Discover() map[string]string {
|
||||
svgs := make(map[string]string)
|
||||
|
||||
files, _ := filepath.Glob(path.Join(setting.StaticRootPath, "public", "img", "svg", "*.svg"))
|
||||
for _, file := range files {
|
||||
content, err := ioutil.ReadFile(file)
|
||||
if err == nil {
|
||||
filename := path.Base(file)
|
||||
svgs[filename[:len(filename)-4]] = string(content)
|
||||
}
|
||||
}
|
||||
|
||||
return svgs
|
||||
}
|
13
modules/svg/svg.go
Normal file
13
modules/svg/svg.go
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package svg
|
||||
|
||||
// SVGs contains discovered SVGs
|
||||
var SVGs map[string]string
|
||||
|
||||
// Init discovers SVGs and populates the `SVGs` variable
|
||||
func Init() {
|
||||
SVGs = Discover()
|
||||
}
|
@ -30,6 +30,7 @@ import (
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
"code.gitea.io/gitea/modules/repository"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/svg"
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/services/gitdiff"
|
||||
@ -439,9 +440,19 @@ func NewTextFuncMap() []texttmpl.FuncMap {
|
||||
}}
|
||||
}
|
||||
|
||||
var widthRe = regexp.MustCompile(`width="[0-9]+?"`)
|
||||
var heightRe = regexp.MustCompile(`height="[0-9]+?"`)
|
||||
|
||||
// SVG render icons
|
||||
func SVG(icon string, size int) template.HTML {
|
||||
return template.HTML(fmt.Sprintf(`<svg class="svg %s" width="%d" height="%d" aria-hidden="true"><use xlink:href="#%s" /></svg>`, icon, size, size, icon))
|
||||
if svgStr, ok := svg.SVGs[icon]; ok {
|
||||
if size != 16 {
|
||||
svgStr = widthRe.ReplaceAllString(svgStr, fmt.Sprintf(`width="%d"`, size))
|
||||
svgStr = heightRe.ReplaceAllString(svgStr, fmt.Sprintf(`height="%d"`, size))
|
||||
}
|
||||
return template.HTML(svgStr)
|
||||
}
|
||||
return template.HTML("")
|
||||
}
|
||||
|
||||
// Safe render raw as HTML
|
||||
|
Reference in New Issue
Block a user