Token.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2020-2021, the SerenityOS developers.
  3. * Copyright (c) 2021-2023, Sam Atkins <atkinssj@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/FlyString.h>
  9. #include <LibWeb/CSS/Number.h>
  10. namespace Web::CSS::Parser {
  11. class Token {
  12. friend class Tokenizer;
  13. public:
  14. enum class Type {
  15. Invalid,
  16. EndOfFile,
  17. Ident,
  18. Function,
  19. AtKeyword,
  20. Hash,
  21. String,
  22. BadString,
  23. Url,
  24. BadUrl,
  25. Delim,
  26. Number,
  27. Percentage,
  28. Dimension,
  29. Whitespace,
  30. CDO,
  31. CDC,
  32. Colon,
  33. Semicolon,
  34. Comma,
  35. OpenSquare,
  36. CloseSquare,
  37. OpenParen,
  38. CloseParen,
  39. OpenCurly,
  40. CloseCurly
  41. };
  42. enum class HashType {
  43. Id,
  44. Unrestricted,
  45. };
  46. struct Position {
  47. size_t line { 0 };
  48. size_t column { 0 };
  49. };
  50. Type type() const { return m_type; }
  51. bool is(Type type) const { return m_type == type; }
  52. FlyString const& ident() const
  53. {
  54. VERIFY(m_type == Type::Ident);
  55. return m_value;
  56. }
  57. FlyString const& function() const
  58. {
  59. VERIFY(m_type == Type::Function);
  60. return m_value;
  61. }
  62. u32 delim() const
  63. {
  64. VERIFY(m_type == Type::Delim);
  65. return *m_value.code_points().begin();
  66. }
  67. FlyString const& string() const
  68. {
  69. VERIFY(m_type == Type::String);
  70. return m_value;
  71. }
  72. FlyString const& url() const
  73. {
  74. VERIFY(m_type == Type::Url);
  75. return m_value;
  76. }
  77. FlyString const& at_keyword() const
  78. {
  79. VERIFY(m_type == Type::AtKeyword);
  80. return m_value;
  81. }
  82. HashType hash_type() const
  83. {
  84. VERIFY(m_type == Type::Hash);
  85. return m_hash_type;
  86. }
  87. FlyString const& hash_value() const
  88. {
  89. VERIFY(m_type == Type::Hash);
  90. return m_value;
  91. }
  92. Number const& number() const
  93. {
  94. VERIFY(m_type == Type::Number || m_type == Type::Dimension || m_type == Type::Percentage);
  95. return m_number_value;
  96. }
  97. double number_value() const
  98. {
  99. VERIFY(m_type == Type::Number);
  100. return m_number_value.value();
  101. }
  102. i64 to_integer() const
  103. {
  104. VERIFY(m_type == Type::Number && m_number_value.is_integer());
  105. return m_number_value.integer_value();
  106. }
  107. FlyString const& dimension_unit() const
  108. {
  109. VERIFY(m_type == Type::Dimension);
  110. return m_value;
  111. }
  112. double dimension_value() const
  113. {
  114. VERIFY(m_type == Type::Dimension);
  115. return m_number_value.value();
  116. }
  117. i64 dimension_value_int() const { return m_number_value.integer_value(); }
  118. double percentage() const
  119. {
  120. VERIFY(m_type == Type::Percentage);
  121. return m_number_value.value();
  122. }
  123. Type mirror_variant() const;
  124. StringView bracket_string() const;
  125. StringView bracket_mirror_string() const;
  126. String to_string() const;
  127. String to_debug_string() const;
  128. String const& representation() const { return m_representation; }
  129. Position const& start_position() const { return m_start_position; }
  130. Position const& end_position() const { return m_end_position; }
  131. static Token create_string(FlyString str)
  132. {
  133. Token token;
  134. token.m_type = Type::String;
  135. token.m_value = move(str);
  136. return token;
  137. }
  138. static Token create_number(double value)
  139. {
  140. Token token;
  141. token.m_type = Type::Number;
  142. token.m_number_value = Number(Number::Type::Number, value);
  143. return token;
  144. }
  145. static Token create_percentage(double value)
  146. {
  147. Token token;
  148. token.m_type = Type::Percentage;
  149. token.m_number_value = Number(Number::Type::Number, value);
  150. return token;
  151. }
  152. static Token create_dimension(double value, FlyString unit)
  153. {
  154. Token token;
  155. token.m_type = Type::Dimension;
  156. token.m_number_value = Number(Number::Type::Number, value);
  157. token.m_value = move(unit);
  158. return token;
  159. }
  160. static Token create_ident(FlyString ident)
  161. {
  162. Token token;
  163. token.m_type = Type::Ident;
  164. token.m_value = move(ident);
  165. return token;
  166. }
  167. static Token create_url(FlyString url)
  168. {
  169. Token token;
  170. token.m_type = Type::Url;
  171. token.m_value = move(url);
  172. return token;
  173. }
  174. private:
  175. Type m_type { Type::Invalid };
  176. FlyString m_value;
  177. Number m_number_value;
  178. HashType m_hash_type { HashType::Unrestricted };
  179. String m_representation;
  180. Position m_start_position;
  181. Position m_end_position;
  182. };
  183. }