Implementation of creating pill and printing to StdOut.
commit
b2b8268532
@ -0,0 +1,33 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const (
|
||||
baseColour = "#555"
|
||||
modifier float64 = 0.2
|
||||
maxValue = 220
|
||||
blue = 55
|
||||
)
|
||||
|
||||
func main() {
|
||||
t := template.New("svgConv")
|
||||
|
||||
percentage := 0.999
|
||||
fill := percentageToRGB(percentage)
|
||||
|
||||
pill := CoveragePill{
|
||||
fmt.Sprintf("%.1f", toFixed(percentage, 3)*100),
|
||||
baseColour,
|
||||
fill,
|
||||
}
|
||||
t, err := t.Parse(svgTemplate)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
_ = t.Execute(os.Stdout, pill)
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const svgTemplate string = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="108" height="20" version="1.1">
|
||||
<linearGradient x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
<mask id="a">
|
||||
<rect width="108" height="20" rx="12" fill="#fff"/>
|
||||
</mask>
|
||||
<g mask="url(#a)">
|
||||
<path d="M0 0h66v20H0z" fill="{{.BaseColour}}"/>
|
||||
<path d="M66 0h44v20H66z" fill="{{.FillColour}}"/>
|
||||
</g>
|
||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||
<text x="34" y="14" fill="#010101" fill-opacity="0.5">coverage</text>
|
||||
<text x="34" y="13">coverage</text>
|
||||
<text x="87" y="15" fill="#010101" fill-opacity=".5">{{.Percentage}}%</text>
|
||||
<text x="87" y="14">{{.Percentage}}%</text>
|
||||
</g>
|
||||
</svg>`
|
||||
|
||||
type CoveragePill struct {
|
||||
Percentage string
|
||||
BaseColour string
|
||||
FillColour string
|
||||
}
|
||||
|
||||
func percentageToRGB(percentage float64) string {
|
||||
red := modifier + clamp(2-2*math.Pow(percentage, 2), 0, 1)*(1-modifier)
|
||||
green := modifier + clamp(2*math.Pow(percentage, 2), 0, 1)*(1-modifier)
|
||||
|
||||
redValue := strconv.Itoa(int(red * maxValue))
|
||||
greenValue := strconv.Itoa(int(green * maxValue))
|
||||
blueValue := strconv.Itoa(blue)
|
||||
|
||||
return "rgb(" + redValue + ", " + greenValue + ", " + blueValue + ")"
|
||||
}
|
||||
|
||||
func clamp(operation float64, min float64, max float64) float64 {
|
||||
if operation < min {
|
||||
return min
|
||||
}
|
||||
if operation > max {
|
||||
return max
|
||||
}
|
||||
return operation
|
||||
}
|
||||
|
||||
func round(num float64) int {
|
||||
return int(num + math.Copysign(0.5, num))
|
||||
}
|
||||
|
||||
func toFixed(num float64, precision int) float64 {
|
||||
output := math.Pow(10, float64(precision))
|
||||
return float64(round(num*output)) / output
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="108" height="20" version="1.1">
|
||||
<linearGradient x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
<mask id="a">
|
||||
<rect width="108" height="20" rx="12" fill="#fff"/>
|
||||
</mask>
|
||||
<g mask="url(#a)">
|
||||
<path d="M0 0h66v20H0z" fill="#555"/>
|
||||
<path d="M66 0h44v20H66z" fill="rgb(49, 220, 55)"/>
|
||||
</g>
|
||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||
<text x="34" y="14" fill="#010101" fill-opacity="0.5">coverage</text>
|
||||
<text x="34" y="13">coverage</text>
|
||||
<text x="87" y="15" fill="#010101" fill-opacity=".5">99.9%</text>
|
||||
<text x="87" y="14">99.9%</text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 875 B |
Loading…
Reference in New Issue