badgemaker.nim 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # author: Ethosa
  2. import streams
  3. import xmltree
  4. import strutils
  5. type
  6. BadgeRef* = ref object
  7. style: string ## egg "flat", "square" or "plastic"
  8. label: string ## left text.
  9. value: string ## right text.
  10. label_text_color: string ## left text color
  11. value_text_color: string ## right text color
  12. label_color: string ## left color.
  13. value_color: string ## right color.
  14. font: string
  15. width, height: int
  16. proc newBadge*(label="", value="", style="flat", label_color="#212121",
  17. value_color="#e0e0e0", label_text_color="white",
  18. value_text_color="black", width=120, height=20): BadgeRef =
  19. BadgeRef(label: label, value: value, style: style,
  20. label_text_color: label_text_color, value_text_color: value_text_color,
  21. label_color: label_color, value_color: value_color,
  22. font: "DejaVu Sans,Verdana,Geneva,sans-serif",
  23. width: width, height: height)
  24. proc setFont*(badge: BadgeRef, font: string) =
  25. badge.font = font
  26. proc write*(badge: BadgeRef, filename: string) =
  27. var tree = newXMLTree(
  28. "svg", [], {
  29. "xmlns": "http://www.w3.org/2000/svg",
  30. "width": $badge.width,
  31. "height": $badge.height
  32. }.toXMLAttributes)
  33. var gradient = newXMLTree(
  34. "linearGradient", [],
  35. {"id": "gradient",
  36. "x2": "0", "y2": "100%"
  37. }.toXMLAttributes)
  38. gradient.add newXMLTree("stop", [], {
  39. "offset": "0", "stop-color": "#bbb",
  40. "stop-opacity": if "plastic" notin badge.style:
  41. "0"
  42. else:
  43. ".1"
  44. }.toXMLAttributes)
  45. gradient.add newXMLTree("stop", [], {
  46. "offset": "1",
  47. "stop-opacity": if "plastic" notin badge.style:
  48. "0"
  49. else:
  50. ".1"
  51. }.toXMLAttributes)
  52. var
  53. main = newXMLTree("g", [], {"mask": "url(#gradient)"}.toXMLAttributes)
  54. labelw = len(badge.label)*9 + len(badge.label)
  55. valuew = len(badge.value)*9 + len(badge.value)
  56. dif =
  57. if labelw > valuew:
  58. labelw - valuew
  59. else:
  60. labelw - 12
  61. radius = if "square" in badge.style: "0" else: "4"
  62. echo dif, " ", labelw, " ", valuew
  63. main.add newXMLTree(
  64. "rect", [], {
  65. "x": "0", "y": "0", "width": $labelw, "height": $badge.height,
  66. "rx": radius,
  67. "ry": radius,
  68. "style": "fill:" & badge.label_color
  69. }.toXMLAttributes
  70. )
  71. main.add newXMLTree(
  72. "rect", [], {
  73. "x": $dif, "y": "0",
  74. "width": $((badge.width - 6) - (dif)),
  75. "height": $badge.height,
  76. "rx": "0", "ry": "0", "style": "fill:" & badge.value_color
  77. }.toXMLAttributes
  78. )
  79. main.add newXMLTree(
  80. "rect", [], {
  81. "x": $(badge.width - 12), "y": "0",
  82. "width": "12", "height": $badge.height,
  83. "rx": radius,
  84. "ry": radius,
  85. "style": "fill:" & badge.value_color
  86. }.toXMLAttributes
  87. )
  88. main.add newXMLTree(
  89. "path", [], {
  90. "fill": "url(#gradient)",
  91. "d": "M0 0h" & $badge.width & "v" & $badge.height & "H0z"
  92. }.toXMLAttributes
  93. )
  94. var text = newXMLTree("g", [], {
  95. "font-family": badge.font, "font-size": "12", "fill": badge.label_color
  96. }.toXMLAttributes)
  97. text.add newXMLTree(
  98. "text", [], {
  99. "x": "2", "y": $(badge.height/2 + 5), "fill": badge.label_text_color
  100. }.toXMLAttributes
  101. )
  102. text[0].add newText badge.label
  103. text.add newXMLTree(
  104. "text", [], {
  105. "x": $(dif + 2),
  106. "y": $(badge.height/2 + 5), "fill": badge.value_text_color
  107. }.toXMLAttributes
  108. )
  109. text[1].add newText badge.value
  110. tree.add gradient
  111. tree.add main
  112. tree.add text
  113. var strm = newFileStream(filename, fmWrite)
  114. strm.write $tree
  115. strm.close