Token.cpp 6.7 KB

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