mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 04:48:25 +00:00 
			
		
		
		
	replace #27187 close #23688 The badge has two parts: label(workflow name) and message(action status). 5 colors are provided with 7 statuses. Color mapping: ```go var statusColorMap = map[actions_model.Status]string{ actions_model.StatusSuccess: "#4c1", // Green actions_model.StatusSkipped: "#dfb317", // Yellow actions_model.StatusUnknown: "#97ca00", // Light Green actions_model.StatusFailure: "#e05d44", // Red actions_model.StatusCancelled: "#fe7d37", // Orange actions_model.StatusWaiting: "#dfb317", // Yellow actions_model.StatusRunning: "#dfb317", // Yellow actions_model.StatusBlocked: "#dfb317", // Yellow } ``` preview:      --------- Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io> Co-authored-by: delvh <dev.lh@web.de>
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2024 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
package badge
 | 
						|
 | 
						|
import (
 | 
						|
	actions_model "code.gitea.io/gitea/models/actions"
 | 
						|
)
 | 
						|
 | 
						|
// The Badge layout: |offset|label|message|
 | 
						|
// We use 10x scale to calculate more precisely
 | 
						|
// Then scale down to normal size in tmpl file
 | 
						|
 | 
						|
type Label struct {
 | 
						|
	text  string
 | 
						|
	width int
 | 
						|
}
 | 
						|
 | 
						|
func (l Label) Text() string {
 | 
						|
	return l.text
 | 
						|
}
 | 
						|
 | 
						|
func (l Label) Width() int {
 | 
						|
	return l.width
 | 
						|
}
 | 
						|
 | 
						|
func (l Label) TextLength() int {
 | 
						|
	return int(float64(l.width-defaultOffset) * 9.5)
 | 
						|
}
 | 
						|
 | 
						|
func (l Label) X() int {
 | 
						|
	return l.width*5 + 10
 | 
						|
}
 | 
						|
 | 
						|
type Message struct {
 | 
						|
	text  string
 | 
						|
	width int
 | 
						|
	x     int
 | 
						|
}
 | 
						|
 | 
						|
func (m Message) Text() string {
 | 
						|
	return m.text
 | 
						|
}
 | 
						|
 | 
						|
func (m Message) Width() int {
 | 
						|
	return m.width
 | 
						|
}
 | 
						|
 | 
						|
func (m Message) X() int {
 | 
						|
	return m.x
 | 
						|
}
 | 
						|
 | 
						|
func (m Message) TextLength() int {
 | 
						|
	return int(float64(m.width-defaultOffset) * 9.5)
 | 
						|
}
 | 
						|
 | 
						|
type Badge struct {
 | 
						|
	Color    string
 | 
						|
	FontSize int
 | 
						|
	Label    Label
 | 
						|
	Message  Message
 | 
						|
}
 | 
						|
 | 
						|
func (b Badge) Width() int {
 | 
						|
	return b.Label.width + b.Message.width
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	defaultOffset    = 9
 | 
						|
	defaultFontSize  = 11
 | 
						|
	DefaultColor     = "#9f9f9f" // Grey
 | 
						|
	defaultFontWidth = 7         // approximate speculation
 | 
						|
)
 | 
						|
 | 
						|
var StatusColorMap = map[actions_model.Status]string{
 | 
						|
	actions_model.StatusSuccess:   "#4c1",    // Green
 | 
						|
	actions_model.StatusSkipped:   "#dfb317", // Yellow
 | 
						|
	actions_model.StatusUnknown:   "#97ca00", // Light Green
 | 
						|
	actions_model.StatusFailure:   "#e05d44", // Red
 | 
						|
	actions_model.StatusCancelled: "#fe7d37", // Orange
 | 
						|
	actions_model.StatusWaiting:   "#dfb317", // Yellow
 | 
						|
	actions_model.StatusRunning:   "#dfb317", // Yellow
 | 
						|
	actions_model.StatusBlocked:   "#dfb317", // Yellow
 | 
						|
}
 | 
						|
 | 
						|
// GenerateBadge generates badge with given template
 | 
						|
func GenerateBadge(label, message, color string) Badge {
 | 
						|
	lw := defaultFontWidth*len(label) + defaultOffset
 | 
						|
	mw := defaultFontWidth*len(message) + defaultOffset
 | 
						|
	x := lw*10 + mw*5 - 10
 | 
						|
	return Badge{
 | 
						|
		Label: Label{
 | 
						|
			text:  label,
 | 
						|
			width: lw,
 | 
						|
		},
 | 
						|
		Message: Message{
 | 
						|
			text:  message,
 | 
						|
			width: mw,
 | 
						|
			x:     x,
 | 
						|
		},
 | 
						|
		FontSize: defaultFontSize * 10,
 | 
						|
		Color:    color,
 | 
						|
	}
 | 
						|
}
 |