StyleRules.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Copyright (c) 2020-2021, the SerenityOS developers.
  3. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibWeb/CSS/Parser/DeclarationOrAtRule.h>
  8. #include <LibWeb/CSS/Parser/StyleBlockRule.h>
  9. #include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
  10. #include <LibWeb/CSS/Parser/StyleDeclarationRule.h>
  11. #include <LibWeb/CSS/Parser/StyleFunctionRule.h>
  12. #include <LibWeb/CSS/Parser/StyleRule.h>
  13. #include <LibWeb/CSS/Serialize.h>
  14. namespace Web::CSS {
  15. DeclarationOrAtRule::DeclarationOrAtRule(RefPtr<StyleRule> at)
  16. : m_type(DeclarationType::At)
  17. , m_at(move(at))
  18. {
  19. }
  20. DeclarationOrAtRule::DeclarationOrAtRule(StyleDeclarationRule declaration)
  21. : m_type(DeclarationType::Declaration)
  22. , m_declaration(move(declaration))
  23. {
  24. }
  25. DeclarationOrAtRule::~DeclarationOrAtRule() = default;
  26. StyleRule::StyleRule(StyleRule::Type type)
  27. : m_type(type)
  28. {
  29. }
  30. StyleRule::~StyleRule() = default;
  31. StyleBlockRule::StyleBlockRule() = default;
  32. StyleBlockRule::~StyleBlockRule() = default;
  33. StyleComponentValueRule::StyleComponentValueRule(Token token)
  34. : m_value(token)
  35. {
  36. }
  37. StyleComponentValueRule::StyleComponentValueRule(NonnullRefPtr<StyleFunctionRule> function)
  38. : m_value(function)
  39. {
  40. }
  41. StyleComponentValueRule::StyleComponentValueRule(NonnullRefPtr<StyleBlockRule> block)
  42. : m_value(block)
  43. {
  44. }
  45. StyleComponentValueRule::~StyleComponentValueRule() = default;
  46. StyleDeclarationRule::StyleDeclarationRule() = default;
  47. StyleDeclarationRule::~StyleDeclarationRule() = default;
  48. StyleFunctionRule::StyleFunctionRule(String name)
  49. : m_name(move(name))
  50. {
  51. }
  52. StyleFunctionRule::StyleFunctionRule(String name, Vector<StyleComponentValueRule>&& values)
  53. : m_name(move(name))
  54. , m_values(move(values))
  55. {
  56. }
  57. StyleFunctionRule::~StyleFunctionRule() = default;
  58. template<class SeparatorType, class CollectionType>
  59. void append_with_to_string(StringBuilder& builder, SeparatorType& separator, CollectionType& collection)
  60. {
  61. bool first = true;
  62. for (auto& item : collection) {
  63. if (first)
  64. first = false;
  65. else
  66. builder.append(separator);
  67. builder.append(item.to_string());
  68. }
  69. }
  70. String DeclarationOrAtRule::to_string() const
  71. {
  72. StringBuilder builder;
  73. switch (m_type) {
  74. default:
  75. case DeclarationType::At:
  76. builder.append(m_at->to_string());
  77. break;
  78. case DeclarationType::Declaration:
  79. builder.append(m_declaration.to_string());
  80. break;
  81. }
  82. return builder.to_string();
  83. }
  84. String StyleRule::to_string() const
  85. {
  86. StringBuilder builder;
  87. if (m_type == Type::At) {
  88. builder.append("@");
  89. serialize_an_identifier(builder, m_name);
  90. }
  91. append_with_to_string(builder, " ", m_prelude);
  92. if (m_block)
  93. builder.append(m_block->to_string());
  94. else
  95. builder.append(';');
  96. return builder.to_string();
  97. }
  98. String StyleBlockRule::to_string() const
  99. {
  100. StringBuilder builder;
  101. builder.append(m_token.bracket_string());
  102. append_with_to_string(builder, " ", m_values);
  103. builder.append(m_token.bracket_mirror_string());
  104. return builder.to_string();
  105. }
  106. String StyleComponentValueRule::to_string() const
  107. {
  108. return m_value.visit(
  109. [](Token const& token) { return token.to_string(); },
  110. [](NonnullRefPtr<StyleBlockRule> const& block) { return block->to_string(); },
  111. [](NonnullRefPtr<StyleFunctionRule> const& function) { return function->to_string(); });
  112. }
  113. String StyleComponentValueRule::to_debug_string() const
  114. {
  115. return m_value.visit(
  116. [](Token const& token) {
  117. return String::formatted("Token: {}", token.to_debug_string());
  118. },
  119. [](NonnullRefPtr<StyleBlockRule> const& block) {
  120. return String::formatted("Function: {}", block->to_string());
  121. },
  122. [](NonnullRefPtr<StyleFunctionRule> const& function) {
  123. return String::formatted("Block: {}", function->to_string());
  124. });
  125. }
  126. String StyleDeclarationRule::to_string() const
  127. {
  128. StringBuilder builder;
  129. serialize_an_identifier(builder, m_name);
  130. builder.append(": ");
  131. append_with_to_string(builder, " ", m_values);
  132. if (m_important == Important::Yes)
  133. builder.append(" !important");
  134. return builder.to_string();
  135. }
  136. String StyleFunctionRule::to_string() const
  137. {
  138. StringBuilder builder;
  139. serialize_an_identifier(builder, m_name);
  140. builder.append("(");
  141. append_with_to_string(builder, " ", m_values);
  142. builder.append(")");
  143. return builder.to_string();
  144. }
  145. }