|
@@ -50,122 +50,103 @@ proc setIcon*(badge: BadgeRef, image_path, color: string) =
|
|
|
badge.image_color = color
|
|
|
|
|
|
proc `$`*(badge: BadgeRef): string =
|
|
|
- var tree = newXMLTree(
|
|
|
- "svg", [], {
|
|
|
- "xmlns": "http://www.w3.org/2000/svg",
|
|
|
- "xmlns:xlink": "http://www.w3.org/1999/xlink",
|
|
|
- "width": $badge.width,
|
|
|
- "height": $badge.height
|
|
|
- }.toXMLAttributes)
|
|
|
-
|
|
|
- var gradient = newXMLTree(
|
|
|
- "linearGradient", [],
|
|
|
- {"id": "gradient",
|
|
|
- "x2": "0", "y2": "100%"
|
|
|
+ let
|
|
|
+ # start variables
|
|
|
+ image_width = if badge.image_path != "": badge.height else: 0
|
|
|
+ labell = len(badge.label)
|
|
|
+ valuel = len(badge.value)
|
|
|
+ labelw = labell*(badge.font_size - 3).int + labell + image_width
|
|
|
+ valuew = valuel*(badge.font_size - 3).int + valuel + image_width
|
|
|
+ radius = if "square" in badge.style: "0" else: "4"
|
|
|
+ dif =
|
|
|
+ if labelw > valuew:
|
|
|
+ labelw - valuew + radius.parseInt
|
|
|
+ else:
|
|
|
+ labelw - badge.font_size + radius.parseInt
|
|
|
+ stop_opacity = if "plastic" notin badge.style: "0" else: ".1"
|
|
|
+
|
|
|
+ var
|
|
|
+ # trees
|
|
|
+ tree = newXMLTree(
|
|
|
+ "svg", [], {
|
|
|
+ "xmlns": "http://www.w3.org/2000/svg",
|
|
|
+ "xmlns:xlink": "http://www.w3.org/1999/xlink",
|
|
|
+ "width": $badge.width, "height": $badge.height
|
|
|
+ }.toXMLAttributes)
|
|
|
+ main = newXMLTree("g", [], {"mask": "url(#gradient)"}.toXMLAttributes)
|
|
|
+ text = newXMLTree("g", [], {
|
|
|
+ "font-family": badge.font, "font-size": $badge.font_size, "fill": badge.label_color
|
|
|
}.toXMLAttributes)
|
|
|
+ gradient = newXMLTree(
|
|
|
+ "linearGradient", [],
|
|
|
+ {"id": "gradient", "x2": "0", "y2": "100%"}.toXMLAttributes)
|
|
|
+
|
|
|
gradient.add newXMLTree("stop", [], {
|
|
|
- "offset": "0", "stop-color": "#bbb",
|
|
|
- "stop-opacity": if "plastic" notin badge.style:
|
|
|
- "0"
|
|
|
- else:
|
|
|
- ".1"
|
|
|
+ "offset": "0", "stop-color": "#bbb", "stop-opacity": stop_opacity
|
|
|
}.toXMLAttributes)
|
|
|
gradient.add newXMLTree("stop", [], {
|
|
|
- "offset": "1",
|
|
|
- "stop-opacity": if "plastic" notin badge.style:
|
|
|
- "0"
|
|
|
- else:
|
|
|
- ".1"
|
|
|
+ "offset": "1", "stop-opacity": stop_opacity
|
|
|
}.toXMLAttributes)
|
|
|
|
|
|
- var
|
|
|
- main = newXMLTree("g", [], {"mask": "url(#gradient)"}.toXMLAttributes)
|
|
|
- image_width =
|
|
|
- if badge.image_path != "":
|
|
|
- badge.height
|
|
|
- else:
|
|
|
- 0
|
|
|
- labelw = len(badge.label)*(badge.font_size - 3).int + len(badge.label) + image_width
|
|
|
- valuew = len(badge.value)*(badge.font_size - 3).int + len(badge.value) + image_width
|
|
|
- dif =
|
|
|
- if labelw > valuew:
|
|
|
- labelw - valuew
|
|
|
- else:
|
|
|
- labelw - badge.font_size
|
|
|
- radius = if "square" in badge.style: "0" else: "4"
|
|
|
-
|
|
|
- dif += radius.parseInt
|
|
|
-
|
|
|
main.add newXMLTree(
|
|
|
"rect", [], {
|
|
|
"x": "0", "y": "0", "width": $labelw, "height": $badge.height,
|
|
|
"rx": radius,
|
|
|
"ry": radius,
|
|
|
"style": "fill:" & badge.label_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
+ }.toXMLAttributes)
|
|
|
main.add newXMLTree(
|
|
|
"rect", [], {
|
|
|
"x": $dif, "y": "0",
|
|
|
"width": $((badge.width - (badge.font_size/2).int) - (dif)),
|
|
|
"height": $badge.height,
|
|
|
"rx": "0", "ry": "0", "style": "fill:" & badge.value_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
+ }.toXMLAttributes)
|
|
|
main.add newXMLTree(
|
|
|
"rect", [], {
|
|
|
"x": $(badge.width - badge.font_size), "y": "0",
|
|
|
"width": $badge.font_size, "height": $badge.height,
|
|
|
- "rx": radius,
|
|
|
- "ry": radius,
|
|
|
+ "rx": radius, "ry": radius,
|
|
|
"style": "fill:" & badge.value_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
+ }.toXMLAttributes)
|
|
|
main.add newXMLTree(
|
|
|
"path", [], {
|
|
|
"fill": "url(#gradient)",
|
|
|
"d": "M0 0h" & $badge.width & "v" & $badge.height & "H0z"
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
-
|
|
|
- var text = newXMLTree("g", [], {
|
|
|
- "font-family": badge.font, "font-size": $badge.font_size, "fill": badge.label_color
|
|
|
}.toXMLAttributes)
|
|
|
|
|
|
text.add newXMLTree(
|
|
|
"text", [], {
|
|
|
"x": $(image_width + 2 + parseInt(radius)),
|
|
|
"y": $(badge.height/2 + (badge.font_size/2) - 1.0), "fill": badge.label_text_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
- text[0].add newText badge.label
|
|
|
-
|
|
|
+ }.toXMLAttributes)
|
|
|
text.add newXMLTree(
|
|
|
"text", [], {
|
|
|
"x": $(dif + 2),
|
|
|
"y": $(badge.height/2 + (badge.font_size/2) - 1.0), "fill": badge.value_text_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
+ }.toXMLAttributes)
|
|
|
+
|
|
|
+ text[0].add newText badge.label
|
|
|
text[1].add newText badge.value
|
|
|
|
|
|
tree.add gradient
|
|
|
tree.add main
|
|
|
tree.add text
|
|
|
if badge.image_path != "":
|
|
|
- var img = newFileStream(badge.image_path, fmRead)
|
|
|
- var image = img.readAll
|
|
|
+ var
|
|
|
+ img = newFileStream(badge.image_path, fmRead)
|
|
|
+ image = img.readAll
|
|
|
img.close
|
|
|
tree.add newXMLTree(
|
|
|
"image", [], {
|
|
|
"xlink:href": "data:image/png;base64," & encode image,
|
|
|
"width": $badge.height, "height": $badge.height,
|
|
|
- "x": radius, "y": "0",
|
|
|
- "fill": badge.image_color
|
|
|
- }.toXMLAttributes
|
|
|
- )
|
|
|
+ "x": radius, "y": "0", "fill": badge.image_color
|
|
|
+ }.toXMLAttributes)
|
|
|
return $tree
|
|
|
|
|
|
proc write*(badge: BadgeRef, filename: string) =
|
|
|
+ ## Writes SVG image in file.
|
|
|
var strm = newFileStream(filename, fmWrite)
|
|
|
strm.write $badge
|
|
|
strm.close
|