FunctionBuffer.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.Collections.Generic;
  3. #pragma warning disable
  4. namespace ExCSS.Model
  5. {
  6. internal class FunctionBuffer
  7. {
  8. private readonly string _function;
  9. private readonly List<Term> _termList;
  10. private Term _term;
  11. internal FunctionBuffer(string function)
  12. {
  13. _termList = new List<Term>();
  14. _function = function;
  15. }
  16. public List<Term> TermList
  17. {
  18. get { return _termList; }
  19. }
  20. public Term Term
  21. {
  22. get { return _term; }
  23. set { _term = value; }
  24. }
  25. public void Include()
  26. {
  27. if (_term != null)
  28. {
  29. _termList.Add(_term);
  30. }
  31. _term = null;
  32. }
  33. public Term Done()
  34. {
  35. Include();
  36. return BuildFunctionTerm(_function, _termList);
  37. }
  38. private Term BuildFunctionTerm(string name, List<Term> terms)
  39. {
  40. switch (name)
  41. {
  42. case "rgb":
  43. {
  44. if (terms.Count == 3)
  45. {
  46. if (CheckNumber(terms[0]) &&
  47. CheckNumber(terms[1]) &&
  48. CheckNumber(terms[2]))
  49. {
  50. return HtmlColor.FromRgb(
  51. ToByte(terms[0]),
  52. ToByte(terms[1]),
  53. ToByte(terms[2]));
  54. }
  55. }
  56. break;
  57. }
  58. case "rgba":
  59. {
  60. if (terms.Count == 4)
  61. {
  62. if (CheckNumber(terms[0]) &&
  63. CheckNumber(terms[1]) &&
  64. CheckNumber(terms[2]) &&
  65. CheckNumber(terms[3]))
  66. {
  67. return HtmlColor.FromRgba(
  68. ToByte(terms[0]),
  69. ToByte(terms[1]),
  70. ToByte(terms[2]),
  71. ToSingle(terms[3]));
  72. }
  73. }
  74. break;
  75. }
  76. case "hsl":
  77. {
  78. if (_termList.Count == 3)
  79. {
  80. if (CheckNumber(terms[0]) &&
  81. CheckNumber(terms[1]) &&
  82. CheckNumber(terms[2]))
  83. {
  84. return HtmlColor.FromHsl(
  85. ToSingle(terms[0]),
  86. ToSingle(terms[1]),
  87. ToSingle(terms[2]));
  88. }
  89. }
  90. break;
  91. }
  92. }
  93. return new GenericFunction(name, terms);
  94. }
  95. private static bool CheckNumber(Term cssValue)
  96. {
  97. return (cssValue is PrimitiveTerm &&
  98. ((PrimitiveTerm)cssValue).PrimitiveType == UnitType.Number);
  99. }
  100. private static Single ToSingle(Term cssValue)
  101. {
  102. var value = ((PrimitiveTerm)cssValue).GetFloatValue(UnitType.Number);
  103. return value.HasValue
  104. ? value.Value
  105. : 0f;
  106. }
  107. private static byte ToByte(Single? value)
  108. {
  109. if (value.HasValue)
  110. {
  111. return (byte)Math.Min(Math.Max(value.Value, 0), 255);
  112. }
  113. return 0;
  114. }
  115. private static byte ToByte(Term cssValue)
  116. {
  117. return ToByte(((PrimitiveTerm)cssValue).GetFloatValue(UnitType.Number));
  118. }
  119. }
  120. }
  121. #pragma warning restore