|
@@ -0,0 +1,129 @@
|
|
|
+# author: Ethosa
|
|
|
+import streams
|
|
|
+import xmltree
|
|
|
+import strutils
|
|
|
+
|
|
|
+
|
|
|
+type
|
|
|
+ BadgeRef* = ref object
|
|
|
+ style: string ## egg "flat", "square" or "plastic"
|
|
|
+ label: string ## left text.
|
|
|
+ value: string ## right text.
|
|
|
+ label_text_color: string ## left text color
|
|
|
+ value_text_color: string ## right text color
|
|
|
+ label_color: string ## left color.
|
|
|
+ value_color: string ## right color.
|
|
|
+ font: string
|
|
|
+ width, height: int
|
|
|
+
|
|
|
+
|
|
|
+proc newBadge*(label="", value="", style="flat", label_color="#212121",
|
|
|
+ value_color="#e0e0e0", label_text_color="white",
|
|
|
+ value_text_color="black", width=120, height=20): BadgeRef =
|
|
|
+ BadgeRef(label: label, value: value, style: style,
|
|
|
+ label_text_color: label_text_color, value_text_color: value_text_color,
|
|
|
+ label_color: label_color, value_color: value_color,
|
|
|
+ font: "DejaVu Sans,Verdana,Geneva,sans-serif",
|
|
|
+ width: width, height: height)
|
|
|
+
|
|
|
+proc setFont*(badge: BadgeRef, font: string) =
|
|
|
+ badge.font = font
|
|
|
+
|
|
|
+proc write*(badge: BadgeRef, filename: string) =
|
|
|
+ var tree = newXMLTree(
|
|
|
+ "svg", [], {
|
|
|
+ "xmlns": "http://www.w3.org/2000/svg",
|
|
|
+ "width": $badge.width,
|
|
|
+ "height": $badge.height
|
|
|
+ }.toXMLAttributes)
|
|
|
+
|
|
|
+ var 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"
|
|
|
+ }.toXMLAttributes)
|
|
|
+ gradient.add newXMLTree("stop", [], {
|
|
|
+ "offset": "1",
|
|
|
+ "stop-opacity": if "plastic" notin badge.style:
|
|
|
+ "0"
|
|
|
+ else:
|
|
|
+ ".1"
|
|
|
+ }.toXMLAttributes)
|
|
|
+
|
|
|
+ var
|
|
|
+ main = newXMLTree("g", [], {"mask": "url(#gradient)"}.toXMLAttributes)
|
|
|
+ labelw = len(badge.label)*9 + len(badge.label)
|
|
|
+ valuew = len(badge.value)*9 + len(badge.value)
|
|
|
+ dif =
|
|
|
+ if labelw > valuew:
|
|
|
+ labelw - valuew
|
|
|
+ else:
|
|
|
+ labelw - 12
|
|
|
+ radius = if "square" in badge.style: "0" else: "4"
|
|
|
+ echo dif, " ", labelw, " ", valuew
|
|
|
+
|
|
|
+ main.add newXMLTree(
|
|
|
+ "rect", [], {
|
|
|
+ "x": "0", "y": "0", "width": $labelw, "height": $badge.height,
|
|
|
+ "rx": radius,
|
|
|
+ "ry": radius,
|
|
|
+ "style": "fill:" & badge.label_color
|
|
|
+ }.toXMLAttributes
|
|
|
+ )
|
|
|
+ main.add newXMLTree(
|
|
|
+ "rect", [], {
|
|
|
+ "x": $dif, "y": "0",
|
|
|
+ "width": $((badge.width - 6) - (dif)),
|
|
|
+ "height": $badge.height,
|
|
|
+ "rx": "0", "ry": "0", "style": "fill:" & badge.value_color
|
|
|
+ }.toXMLAttributes
|
|
|
+ )
|
|
|
+ main.add newXMLTree(
|
|
|
+ "rect", [], {
|
|
|
+ "x": $(badge.width - 12), "y": "0",
|
|
|
+ "width": "12", "height": $badge.height,
|
|
|
+ "rx": radius,
|
|
|
+ "ry": radius,
|
|
|
+ "style": "fill:" & badge.value_color
|
|
|
+ }.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": "12", "fill": badge.label_color
|
|
|
+ }.toXMLAttributes)
|
|
|
+
|
|
|
+ text.add newXMLTree(
|
|
|
+ "text", [], {
|
|
|
+ "x": "2", "y": $(badge.height/2 + 5), "fill": badge.label_text_color
|
|
|
+ }.toXMLAttributes
|
|
|
+ )
|
|
|
+ text[0].add newText badge.label
|
|
|
+
|
|
|
+ text.add newXMLTree(
|
|
|
+ "text", [], {
|
|
|
+ "x": $(dif + 2),
|
|
|
+ "y": $(badge.height/2 + 5), "fill": badge.value_text_color
|
|
|
+ }.toXMLAttributes
|
|
|
+ )
|
|
|
+ text[1].add newText badge.value
|
|
|
+
|
|
|
+ tree.add gradient
|
|
|
+ tree.add main
|
|
|
+ tree.add text
|
|
|
+
|
|
|
+ var strm = newFileStream(filename, fmWrite)
|
|
|
+ strm.write $tree
|
|
|
+ strm.close
|