css.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package ultraviolet
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func ViewToString(view View) string {
  7. parts := []string{
  8. DisplayToString(view.Block.Display),
  9. PositionToString(view.Block.Position),
  10. FloatToString(view.Block.Float),
  11. WidthToString(view.Block.Width),
  12. HeightToString(view.Block.Height),
  13. BottomToString(view.Block.Bottom),
  14. LeftToString(view.Block.Left),
  15. TopToString(view.Block.Top),
  16. RightToString(view.Block.Right),
  17. MarginToString(view.Block.Margin),
  18. PaddingToString(view.Block.Padding),
  19. BorderThicknessToString(view.Block.Border),
  20. BorderRadiusToString(view.Block.Border),
  21. BorderRadiusToString(view.Block.Border),
  22. BackgroundToString(view.Background),
  23. FontToString(view.Font),
  24. view.Custom,
  25. }
  26. switch view.Cursor {
  27. case CURSOR_POINTER:
  28. parts = append(parts, "cursor: pointer;")
  29. parts = append(parts, "user-select: none;")
  30. }
  31. return strings.Join(parts, "")
  32. }
  33. func DisplayToString(display int) string {
  34. switch display {
  35. case DISPLAY_BLOCK:
  36. return "display: block;"
  37. case DISPLAY_INLINE:
  38. return "display: inline-block;"
  39. }
  40. return ""
  41. }
  42. func PositionToString(position int) string {
  43. switch position {
  44. case POSITION_FIXED:
  45. return "position: fixed;"
  46. case POSITION_RELATIVE:
  47. return "position: relative;"
  48. case POSITION_ABSOLUTE:
  49. return "position: absolute;"
  50. }
  51. return ""
  52. }
  53. func FloatToString(float int) string {
  54. switch float {
  55. case FLOAT_LEFT:
  56. return "float: left;"
  57. case FLOAT_RIGHT:
  58. return "float: right;"
  59. case FLOAT_CLEAR:
  60. return "clear: both;"
  61. }
  62. return ""
  63. }
  64. func WidthToString(width int) string {
  65. if width == 0 {
  66. return ""
  67. }
  68. return fmt.Sprintf("width: %dpx;", width)
  69. }
  70. func HeightToString(height int) string {
  71. if height == 0 {
  72. return ""
  73. }
  74. return fmt.Sprintf("height: %dpx;", height)
  75. }
  76. func BottomToString(bottom int) string {
  77. if bottom == 0 {
  78. return ""
  79. }
  80. return fmt.Sprintf("bottom: %dpx;", bottom)
  81. }
  82. func LeftToString(left int) string {
  83. if left == 0 {
  84. return ""
  85. }
  86. return fmt.Sprintf("left: %dpx;", left)
  87. }
  88. func TopToString(top int) string {
  89. if top == 0 {
  90. return ""
  91. }
  92. return fmt.Sprintf("top: %dpx;", top)
  93. }
  94. func RightToString(right int) string {
  95. if right == 0 {
  96. return ""
  97. }
  98. return fmt.Sprintf("right: %dpx;", right)
  99. }
  100. func MarginToString(margin Margin) string {
  101. if margin.Center {
  102. return "margin: 0 auto;"
  103. }
  104. if margin.Top == 0 && margin.Right == 0 && margin.Bottom == 0 && margin.Left == 0 {
  105. return ""
  106. }
  107. return fmt.Sprintf(
  108. "margin: %dpx %dpx %dpx %dpx;",
  109. margin.Top,
  110. margin.Right,
  111. margin.Bottom,
  112. margin.Left,
  113. )
  114. }
  115. func PaddingToString(padding Padding) string {
  116. if padding.Top == 0 && padding.Right == 0 && padding.Bottom == 0 && padding.Left == 0 {
  117. return ""
  118. }
  119. return fmt.Sprintf(
  120. "padding: %dpx %dpx %dpx %dpx;",
  121. padding.Top,
  122. padding.Right,
  123. padding.Bottom,
  124. padding.Left,
  125. )
  126. }
  127. func BorderThicknessToString(border Border) string {
  128. color := ColorToString(border.Color)
  129. parts := []string{}
  130. if border.ThicknessTop != 0 {
  131. parts = append(
  132. parts,
  133. fmt.Sprintf("border-top: %dpx solid %s;", border.ThicknessTop, color),
  134. )
  135. }
  136. if border.ThicknessRight != 0 {
  137. parts = append(
  138. parts,
  139. fmt.Sprintf("border-right: %dpx solid %s;", border.ThicknessRight, color),
  140. )
  141. }
  142. if border.ThicknessBottom != 0 {
  143. parts = append(
  144. parts,
  145. fmt.Sprintf("border-bottom: %dpx solid %s;", border.ThicknessBottom, color),
  146. )
  147. }
  148. if border.ThicknessLeft != 0 {
  149. parts = append(
  150. parts,
  151. fmt.Sprintf("border-left: %dpx solid %s;", border.ThicknessLeft, color),
  152. )
  153. }
  154. return strings.Join(parts, "")
  155. }
  156. func BorderRadiusToString(border Border) string {
  157. if border.RadiusTopLeft == 0 && border.RadiusTopRight == 0 && border.RadiusBottomRight == 0 && border.RadiusBottomLeft == 0 {
  158. return ""
  159. }
  160. return fmt.Sprintf(
  161. "border-radius: %dpx %dpx %dpx %dpx;",
  162. border.RadiusTopLeft,
  163. border.RadiusTopRight,
  164. border.RadiusBottomRight,
  165. border.RadiusBottomLeft,
  166. )
  167. }
  168. func BackgroundToString(background Background) string {
  169. if background.Color.Alpha == 0 {
  170. return ""
  171. }
  172. return fmt.Sprintf("background-color: %s;", ColorToString(background.Color))
  173. }
  174. func ColorToString(color Color) string {
  175. if color.Alpha == 0 {
  176. return ""
  177. }
  178. return fmt.Sprintf(
  179. "rgba(%d, %d, %d, %.2f)",
  180. color.Red,
  181. color.Green,
  182. color.Blue,
  183. float64(color.Alpha)/255,
  184. )
  185. }
  186. func FontToString(font Font) string {
  187. parts := []string{}
  188. if font.Family != "" {
  189. parts = append(
  190. parts,
  191. fmt.Sprintf("font-family: '%s';", font.Family),
  192. )
  193. }
  194. if font.Size != 0 {
  195. parts = append(
  196. parts,
  197. fmt.Sprintf("font-size: %dpx;", font.Size),
  198. )
  199. }
  200. if font.Uppercase {
  201. parts = append(
  202. parts,
  203. "text-transform: uppercase;",
  204. )
  205. }
  206. if font.Bold {
  207. parts = append(
  208. parts,
  209. "font-weight: bold;",
  210. )
  211. }
  212. if font.Italic {
  213. parts = append(
  214. parts,
  215. "font-view: italic;",
  216. )
  217. }
  218. switch font.Decoration {
  219. case DECORATION_UNDERLINE:
  220. parts = append(
  221. parts,
  222. "text-decoration: underline;",
  223. )
  224. }
  225. if font.LetterSpacing != 0 {
  226. parts = append(
  227. parts,
  228. fmt.Sprintf("letter-spacing: %dpx;", font.LetterSpacing),
  229. )
  230. }
  231. fontColor := ColorToString(font.Color)
  232. if fontColor != "" {
  233. parts = append(
  234. parts,
  235. fmt.Sprintf("color: %s;", ColorToString(font.Color)),
  236. )
  237. }
  238. return strings.Join(parts, "")
  239. }