MediaQuery.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/CSS/MediaQuery.h>
  7. namespace Web::CSS {
  8. NonnullRefPtr<MediaQuery> MediaQuery::create_not_all()
  9. {
  10. auto media_query = new MediaQuery;
  11. media_query->m_negated = true;
  12. media_query->m_media_type = MediaType::All;
  13. return adopt_ref(*media_query);
  14. }
  15. String MediaQuery::MediaFeature::to_string() const
  16. {
  17. switch (type) {
  18. case Type::IsTrue:
  19. return name;
  20. case Type::ExactValue:
  21. return String::formatted("{}:{}", name, value->to_string());
  22. case Type::MinValue:
  23. return String::formatted("min-{}:{}", name, value->to_string());
  24. case Type::MaxValue:
  25. return String::formatted("max-{}:{}", name, value->to_string());
  26. }
  27. VERIFY_NOT_REACHED();
  28. }
  29. String MediaQuery::MediaCondition::to_string() const
  30. {
  31. StringBuilder builder;
  32. builder.append('(');
  33. switch (type) {
  34. case Type::Single:
  35. builder.append(feature.to_string());
  36. break;
  37. case Type::Not:
  38. builder.append("not ");
  39. builder.append(conditions.first().to_string());
  40. break;
  41. case Type::And:
  42. builder.join(" and ", conditions);
  43. break;
  44. case Type::Or:
  45. builder.join(" or ", conditions);
  46. break;
  47. }
  48. builder.append(')');
  49. return builder.to_string();
  50. }
  51. String MediaQuery::to_string() const
  52. {
  53. StringBuilder builder;
  54. if (m_negated)
  55. builder.append("not ");
  56. if (m_negated || m_media_type != MediaType::All || !m_media_condition) {
  57. switch (m_media_type) {
  58. case MediaType::All:
  59. builder.append("all");
  60. break;
  61. case MediaType::Aural:
  62. builder.append("aural");
  63. break;
  64. case MediaType::Braille:
  65. builder.append("braille");
  66. break;
  67. case MediaType::Embossed:
  68. builder.append("embossed");
  69. break;
  70. case MediaType::Handheld:
  71. builder.append("handheld");
  72. break;
  73. case MediaType::Print:
  74. builder.append("print");
  75. break;
  76. case MediaType::Projection:
  77. builder.append("projection");
  78. break;
  79. case MediaType::Screen:
  80. builder.append("screen");
  81. break;
  82. case MediaType::Speech:
  83. builder.append("speech");
  84. break;
  85. case MediaType::TTY:
  86. builder.append("tty");
  87. break;
  88. case MediaType::TV:
  89. builder.append("tv");
  90. break;
  91. }
  92. if (m_media_condition)
  93. builder.append(" and ");
  94. }
  95. if (m_media_condition) {
  96. builder.append(m_media_condition->to_string());
  97. }
  98. return builder.to_string();
  99. }
  100. }