123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- # author: Ethosa
- import streams
- import xmltree
- import strutils
- from base64 import encode
- type
- BadgeRef* = ref object
- style: string ## egg "flat", "square", "plastic" etc.
- 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
- font_size: int
- width, height: int
- image_path: string
- image_color: string
- 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 =
- ## Creates a new Badge object.
- 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, image_path: "", image_color: "",
- font_size: 12)
- proc setFont*(badge: BadgeRef, font: string) =
- ## Sets badge font.
- badge.font = font
- proc setFontSize*(badge: BadgeRef, size: int) =
- ## Sets badge font size.
- badge.font_size = size
- proc setIcon*(badge: BadgeRef, image_path: string) =
- ## Sets icon for badge.
- badge.image_path = image_path
- proc setIcon*(badge: BadgeRef, image_path, color: string) =
- ## Sets icon with fill color.
- badge.image_path = image_path
- 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%"
- }.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)
- 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
- )
- 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
- )
- main.add newXMLTree(
- "rect", [], {
- "x": $(badge.width - badge.font_size), "y": "0",
- "width": $badge.font_size, "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": $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
- text.add newXMLTree(
- "text", [], {
- "x": $(dif + 2),
- "y": $(badge.height/2 + (badge.font_size/2) - 1.0), "fill": badge.value_text_color
- }.toXMLAttributes
- )
- 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
- 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
- )
- return $tree
- proc write*(badge: BadgeRef, filename: string) =
- var strm = newFileStream(filename, fmWrite)
- strm.write $badge
- strm.close
|