StyleRules.cpp 3.9 KB

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