Token.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. * Copyright (c) 2020-2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include <LibWeb/CSS/Parser/Token.h>
  8. #include <LibWeb/CSS/Serialize.h>
  9. namespace Web::CSS {
  10. String Token::to_string() const
  11. {
  12. StringBuilder builder;
  13. switch (m_type) {
  14. case Type::EndOfFile:
  15. return "";
  16. case Type::Ident:
  17. return serialize_an_identifier(ident());
  18. case Type::Function:
  19. return String::formatted("{}(", serialize_an_identifier(function()));
  20. case Type::AtKeyword:
  21. return String::formatted("@{}", serialize_an_identifier(at_keyword()));
  22. case Type::Hash:
  23. return String::formatted("#{}", serialize_an_identifier(hash_value()));
  24. case Type::String:
  25. return serialize_a_string(string());
  26. case Type::BadString:
  27. return "";
  28. case Type::Url:
  29. return serialize_a_url(url());
  30. case Type::BadUrl:
  31. return "url()";
  32. case Type::Delim:
  33. return m_value;
  34. case Type::Number:
  35. return String::number(m_number_value);
  36. case Type::Percentage:
  37. return String::formatted("{}%", m_number_value);
  38. case Type::Dimension:
  39. return String::formatted("{}{}", m_number_value, m_unit);
  40. case Type::Whitespace:
  41. return " ";
  42. case Type::CDO:
  43. return "<!--";
  44. case Type::CDC:
  45. return "-->";
  46. case Type::Colon:
  47. return ":";
  48. case Type::Semicolon:
  49. return ";";
  50. case Type::Comma:
  51. return ",";
  52. case Type::OpenSquare:
  53. return "[";
  54. case Type::CloseSquare:
  55. return "]";
  56. case Type::OpenParen:
  57. return "(";
  58. case Type::CloseParen:
  59. return ")";
  60. case Type::OpenCurly:
  61. return "{";
  62. case Type::CloseCurly:
  63. return "}";
  64. case Type::Invalid:
  65. default:
  66. VERIFY_NOT_REACHED();
  67. }
  68. }
  69. String Token::to_debug_string() const
  70. {
  71. StringBuilder builder;
  72. switch (m_type) {
  73. case Type::Invalid:
  74. VERIFY_NOT_REACHED();
  75. case Type::EndOfFile:
  76. builder.append("__EOF__");
  77. break;
  78. case Type::Ident:
  79. builder.append("Identifier: ");
  80. builder.append(m_value);
  81. return builder.to_string();
  82. case Type::Function:
  83. builder.append("Function");
  84. break;
  85. case Type::AtKeyword:
  86. builder.append("@");
  87. break;
  88. case Type::Hash:
  89. builder.append("Hash: ");
  90. builder.append(m_value);
  91. return builder.to_string();
  92. case Type::String:
  93. builder.append("String: ");
  94. builder.append(m_value);
  95. return builder.to_string();
  96. case Type::BadString:
  97. builder.append("Invalid String");
  98. break;
  99. case Type::Url:
  100. builder.append("Url");
  101. break;
  102. case Type::BadUrl:
  103. builder.append("Invalid Url");
  104. break;
  105. case Type::Delim:
  106. builder.append("Delimiter: ");
  107. builder.append(m_value);
  108. return builder.to_string();
  109. case Type::Number:
  110. builder.append("Number: ");
  111. builder.append(m_value);
  112. builder.append(m_number_type == NumberType::Integer ? " (int)" : " (float)");
  113. return builder.to_string();
  114. case Type::Percentage:
  115. builder.append("Percentage: ");
  116. builder.append(m_value);
  117. builder.append('%');
  118. return builder.to_string();
  119. case Type::Dimension:
  120. builder.append("Dimension: ");
  121. builder.append(m_value);
  122. builder.append(m_unit);
  123. return builder.to_string();
  124. case Type::Whitespace:
  125. builder.append("Whitespace");
  126. break;
  127. case Type::CDO:
  128. builder.append("CDO");
  129. break;
  130. case Type::CDC:
  131. builder.append("CDC");
  132. break;
  133. case Type::Colon:
  134. builder.append(":");
  135. break;
  136. case Type::Semicolon:
  137. builder.append(";");
  138. break;
  139. case Type::Comma:
  140. builder.append(",");
  141. break;
  142. case Type::OpenSquare:
  143. builder.append("[");
  144. break;
  145. case Type::CloseSquare:
  146. builder.append("]");
  147. break;
  148. case Type::OpenParen:
  149. builder.append("(");
  150. break;
  151. case Type::CloseParen:
  152. builder.append(")");
  153. break;
  154. case Type::OpenCurly:
  155. builder.append("{");
  156. break;
  157. case Type::CloseCurly:
  158. builder.append("}");
  159. break;
  160. }
  161. if (m_value.is_empty()) {
  162. return builder.to_string();
  163. }
  164. builder.append(" ");
  165. builder.append(" { value: '");
  166. builder.append(m_value);
  167. if (m_type == Token::Type::Hash) {
  168. builder.append("', hash_type: '");
  169. if (m_hash_type == Token::HashType::Unrestricted) {
  170. builder.append("Unrestricted");
  171. } else {
  172. builder.append("Id");
  173. }
  174. }
  175. if (m_type == Token::Type::Number) {
  176. builder.append("', number_type: '");
  177. if (m_number_type == Token::NumberType::Integer) {
  178. builder.append("Integer");
  179. } else {
  180. builder.append("Number");
  181. }
  182. }
  183. if (m_type == Token::Type::Dimension) {
  184. builder.append("', number_type: '");
  185. if (m_number_type == Token::NumberType::Integer) {
  186. builder.append("Integer");
  187. } else {
  188. builder.append("Number");
  189. }
  190. builder.append("', unit: '");
  191. builder.append(m_unit);
  192. }
  193. builder.append("' }");
  194. return builder.to_string();
  195. }
  196. Token::Type Token::mirror_variant() const
  197. {
  198. if (is(Token::Type::OpenCurly)) {
  199. return Type::CloseCurly;
  200. }
  201. if (is(Token::Type::OpenSquare)) {
  202. return Type::CloseSquare;
  203. }
  204. if (is(Token::Type::OpenParen)) {
  205. return Type::CloseParen;
  206. }
  207. return Type::Invalid;
  208. }
  209. String Token::bracket_string() const
  210. {
  211. if (is(Token::Type::OpenCurly)) {
  212. return "{";
  213. }
  214. if (is(Token::Type::CloseCurly)) {
  215. return "}";
  216. }
  217. if (is(Token::Type::OpenSquare)) {
  218. return "[";
  219. }
  220. if (is(Token::Type::CloseSquare)) {
  221. return "]";
  222. }
  223. if (is(Token::Type::OpenParen)) {
  224. return "(";
  225. }
  226. if (is(Token::Type::CloseParen)) {
  227. return ")";
  228. }
  229. return "";
  230. }
  231. String Token::bracket_mirror_string() const
  232. {
  233. if (is(Token::Type::OpenCurly)) {
  234. return "}";
  235. }
  236. if (is(Token::Type::CloseCurly)) {
  237. return "{";
  238. }
  239. if (is(Token::Type::OpenSquare)) {
  240. return "]";
  241. }
  242. if (is(Token::Type::CloseSquare)) {
  243. return "[";
  244. }
  245. if (is(Token::Type::OpenParen)) {
  246. return ")";
  247. }
  248. if (is(Token::Type::CloseParen)) {
  249. return "(";
  250. }
  251. return "";
  252. }
  253. }