Helpers.cpp 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) 2018-2022, Andreas Kling <andreas@ladybird.org>
  3. * Copyright (c) 2020-2023, the SerenityOS developers.
  4. * Copyright (c) 2021-2024, Sam Atkins <atkinssj@serenityos.org>
  5. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  6. * Copyright (c) 2022, MacDue <macdue@dueutil.tech>
  7. *
  8. * SPDX-License-Identifier: BSD-2-Clause
  9. */
  10. #include <LibWeb/CSS/CSSMediaRule.h>
  11. #include <LibWeb/CSS/CSSRuleList.h>
  12. #include <LibWeb/CSS/CSSStyleSheet.h>
  13. #include <LibWeb/CSS/Parser/Parser.h>
  14. namespace Web {
  15. CSS::CSSStyleSheet* parse_css_stylesheet(CSS::Parser::ParsingContext const& context, StringView css, Optional<URL::URL> location)
  16. {
  17. if (css.is_empty()) {
  18. auto rule_list = CSS::CSSRuleList::create_empty(context.realm());
  19. auto media_list = CSS::MediaList::create(context.realm(), {});
  20. auto style_sheet = CSS::CSSStyleSheet::create(context.realm(), rule_list, media_list, location);
  21. style_sheet->set_source_text({});
  22. return style_sheet;
  23. }
  24. auto* style_sheet = CSS::Parser::Parser::create(context, css).parse_as_css_stylesheet(location);
  25. // FIXME: Avoid this copy
  26. style_sheet->set_source_text(MUST(String::from_utf8(css)));
  27. return style_sheet;
  28. }
  29. CSS::ElementInlineCSSStyleDeclaration* parse_css_style_attribute(CSS::Parser::ParsingContext const& context, StringView css, DOM::Element& element)
  30. {
  31. if (css.is_empty())
  32. return CSS::ElementInlineCSSStyleDeclaration::create(element, {}, {});
  33. return CSS::Parser::Parser::create(context, css).parse_as_style_attribute(element);
  34. }
  35. RefPtr<CSS::CSSStyleValue> parse_css_value(CSS::Parser::ParsingContext const& context, StringView string, CSS::PropertyID property_id)
  36. {
  37. if (string.is_empty())
  38. return nullptr;
  39. return CSS::Parser::Parser::create(context, string).parse_as_css_value(property_id);
  40. }
  41. CSS::CSSRule* parse_css_rule(CSS::Parser::ParsingContext const& context, StringView css_text)
  42. {
  43. return CSS::Parser::Parser::create(context, css_text).parse_as_css_rule();
  44. }
  45. Optional<CSS::SelectorList> parse_selector(CSS::Parser::ParsingContext const& context, StringView selector_text)
  46. {
  47. return CSS::Parser::Parser::create(context, selector_text).parse_as_selector();
  48. }
  49. Optional<CSS::SelectorList> parse_selector_for_nested_style_rule(CSS::Parser::ParsingContext const& context, StringView selector_text)
  50. {
  51. auto parser = CSS::Parser::Parser::create(context, selector_text);
  52. auto maybe_selectors = parser.parse_as_relative_selector(CSS::Parser::Parser::SelectorParsingMode::Standard);
  53. if (!maybe_selectors.has_value())
  54. return {};
  55. return adapt_nested_relative_selector_list(*maybe_selectors);
  56. }
  57. Optional<CSS::Selector::PseudoElement> parse_pseudo_element_selector(CSS::Parser::ParsingContext const& context, StringView selector_text)
  58. {
  59. return CSS::Parser::Parser::create(context, selector_text).parse_as_pseudo_element_selector();
  60. }
  61. RefPtr<CSS::MediaQuery> parse_media_query(CSS::Parser::ParsingContext const& context, StringView string)
  62. {
  63. return CSS::Parser::Parser::create(context, string).parse_as_media_query();
  64. }
  65. Vector<NonnullRefPtr<CSS::MediaQuery>> parse_media_query_list(CSS::Parser::ParsingContext const& context, StringView string)
  66. {
  67. return CSS::Parser::Parser::create(context, string).parse_as_media_query_list();
  68. }
  69. RefPtr<CSS::Supports> parse_css_supports(CSS::Parser::ParsingContext const& context, StringView string)
  70. {
  71. if (string.is_empty())
  72. return {};
  73. return CSS::Parser::Parser::create(context, string).parse_as_supports();
  74. }
  75. Optional<CSS::StyleProperty> parse_css_supports_condition(CSS::Parser::ParsingContext const& context, StringView string)
  76. {
  77. if (string.is_empty())
  78. return {};
  79. return CSS::Parser::Parser::create(context, string).parse_as_supports_condition();
  80. }
  81. }