simple.ml 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. open Types
  2. let hex6 = Str.regexp "\\([0-9a-f]\\)\\1\\([0-9a-f]\\)\\2\\([0-9a-f]\\)\\3"
  3. let is_num = function
  4. | Number (n, (None | Some "%")) -> true
  5. | _ -> false
  6. let clip = function
  7. | Number (n, u) when n < 0. -> Number (0., u)
  8. | Number (n, None) when n > 255. -> Number (255., None)
  9. | Number (n, Some "%") when n > 100. -> Number (100., Some "%")
  10. | value -> value
  11. let rec shorten_expr = function
  12. (* #aabbcc -> #abc *)
  13. | Hexcolor h when Str.string_match hex6 h 0 ->
  14. let gr n = Str.matched_group n h in
  15. shorten_expr (Hexcolor (gr 1 ^ gr 2 ^ gr 3))
  16. (* rgb(r,g,b) -> #rrggbb *)
  17. | Function ("rgb", Nary (",", [r; g; b]))
  18. when is_num r && is_num g && is_num b ->
  19. let i c =
  20. match clip c with
  21. | Number (n, None) -> int_of_float n
  22. | Number (n, Some "%") -> int_of_float (n *. 2.55 +. 0.5)
  23. | _ -> assert false
  24. in
  25. shorten_expr (Hexcolor (Printf.sprintf "%02x%02x%02x" (i r) (i g) (i b)))
  26. (* clip rgb values, e.g. rgb(-1,256,0) -> rgb(0,255,0) *)
  27. | Function ("rgb", Nary (",", [r; g; b])) ->
  28. Function ("rgb", Nary (",", [clip r; clip g; clip b]))
  29. (* rgba(r,g,b,1.0) -> rgb(r,g,b) *)
  30. | Function ("rgba", Nary (",", [r; g; b; Number (1., None)])) ->
  31. shorten_expr (Function ("rgb", Nary (",", [r; g; b])))
  32. (* TODO: hsl[a](...) *)
  33. (* transform color names to shorter hex codes and vice-versa *)
  34. | v -> Color_names.compress v
  35. let shorten_font_weight = function
  36. | Ident "normal" -> Number (400.0, None)
  37. | Ident "bold" -> Number (700.0, None)
  38. | v -> v
  39. let compress =
  40. Util.transform_stylesheet begin function
  41. | Expr value -> Expr (shorten_expr value)
  42. | Declaration ("font-weight", value, imp) ->
  43. Declaration ("font-weight", shorten_font_weight value, imp)
  44. | v -> v
  45. end