|
@@ -8,10 +8,12 @@ import (
|
|
"bytes"
|
|
"bytes"
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "html/template"
|
|
"io"
|
|
"io"
|
|
"mime/multipart"
|
|
"mime/multipart"
|
|
"os"
|
|
"os"
|
|
"path"
|
|
"path"
|
|
|
|
+ "strconv"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
@@ -958,6 +960,26 @@ func (m *Label) CalOpenIssues() {
|
|
m.NumOpenIssues = m.NumIssues - m.NumClosedIssues
|
|
m.NumOpenIssues = m.NumIssues - m.NumClosedIssues
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ForegroundColor calculates the text color for labels based
|
|
|
|
+// on their background color
|
|
|
|
+func (l *Label) ForegroundColor() template.CSS {
|
|
|
|
+ if strings.HasPrefix(l.Color, "#") {
|
|
|
|
+ if color, err := strconv.ParseUint(l.Color[1:], 16, 64); err == nil {
|
|
|
|
+ r := float32(0xFF & (color >> 16))
|
|
|
|
+ g := float32(0xFF & (color >> 8))
|
|
|
|
+ b := float32(0xFF & color)
|
|
|
|
+ luminance := (0.2126*r + 0.7152*g + 0.0722*b) / 255
|
|
|
|
+
|
|
|
|
+ if luminance < 0.5 {
|
|
|
|
+ return template.CSS("rgba(255,255,255,.8)")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // default to black
|
|
|
|
+ return template.CSS("rgba(0,0,0,.8)")
|
|
|
|
+}
|
|
|
|
+
|
|
// NewLabel creates new label of repository.
|
|
// NewLabel creates new label of repository.
|
|
func NewLabel(l *Label) error {
|
|
func NewLabel(l *Label) error {
|
|
_, err := x.Insert(l)
|
|
_, err := x.Insert(l)
|