diff options
Diffstat (limited to 'src/libserver/css/css_property.cxx')
-rw-r--r-- | src/libserver/css/css_property.cxx | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/libserver/css/css_property.cxx b/src/libserver/css/css_property.cxx new file mode 100644 index 0000000..1557109 --- /dev/null +++ b/src/libserver/css/css_property.cxx @@ -0,0 +1,69 @@ +/*- + * Copyright 2021 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "css_property.hxx" +#include "frozen/unordered_map.h" +#include "frozen/string.h" +#include "libutil/cxx/util.hxx" + +namespace rspamd::css { + +constexpr const auto prop_names_map = frozen::make_unordered_map<frozen::string, css_property_type>({ + {"font", css_property_type::PROPERTY_FONT}, + {"font-color", css_property_type::PROPERTY_FONT_COLOR}, + {"font-size", css_property_type::PROPERTY_FONT_SIZE}, + {"color", css_property_type::PROPERTY_COLOR}, + {"bgcolor", css_property_type::PROPERTY_BGCOLOR}, + {"background-color", css_property_type::PROPERTY_BGCOLOR}, + {"background", css_property_type::PROPERTY_BACKGROUND}, + {"height", css_property_type::PROPERTY_HEIGHT}, + {"width", css_property_type::PROPERTY_WIDTH}, + {"display", css_property_type::PROPERTY_DISPLAY}, + {"visibility", css_property_type::PROPERTY_VISIBILITY}, + {"opacity", css_property_type::PROPERTY_OPACITY}, +}); + +/* Ensure that we have all cases listed */ +static_assert(prop_names_map.size() >= static_cast<int>(css_property_type::PROPERTY_NYI)); + +auto token_string_to_property(const std::string_view &inp) + -> css_property_type +{ + + css_property_type ret = css_property_type::PROPERTY_NYI; + + auto known_type = find_map(prop_names_map, inp); + + if (known_type) { + ret = known_type.value().get(); + } + + return ret; +} + +auto css_property::from_token(const css_parser_token &tok) + -> tl::expected<css_property, css_parse_error> +{ + if (tok.type == css_parser_token::token_type::ident_token) { + auto sv = tok.get_string_or_default(""); + + return css_property{token_string_to_property(sv), css_property_flag::FLAG_NORMAL}; + } + + return tl::unexpected{css_parse_error(css_parse_error_type::PARSE_ERROR_NYI)}; +} + +}// namespace rspamd::css |