Skip to main content

stylex_css/css/
generate_ltr.rs

1use stylex_constants::constants::logical_to_ltr::{INLINE_PROPERTY_TO_LTR, PROPERTY_TO_LTR};
2use stylex_enums::style_resolution::StyleResolution;
3use stylex_structures::{pair::Pair, stylex_state_options::StyleXStateOptions};
4
5pub fn generate_ltr(pair: &Pair, options: &StyleXStateOptions) -> Pair {
6  let enable_logical_styles_polyfill = options.enable_logical_styles_polyfill;
7  let style_resolution = &options.style_resolution;
8  let key = pair.key.as_str();
9
10  if style_resolution == &StyleResolution::LegacyExpandShorthands {
11    if !enable_logical_styles_polyfill {
12      return pair.clone();
13    }
14
15    if let Some(inline_to_ltr_value) = INLINE_PROPERTY_TO_LTR.get(key) {
16      return Pair::new(inline_to_ltr_value.to_string(), pair.value.clone());
17    }
18  }
19
20  property_to_ltr(pair)
21}
22
23fn logical_to_physical_ltr(input: &str) -> Option<&str> {
24  match input {
25    "start" | "inline-start" => Some("left"),
26    "end" | "inline-end" => Some("right"),
27    _ => None,
28  }
29}
30
31fn property_to_ltr(pair: &Pair) -> Pair {
32  match pair.key.as_str() {
33    "background-position" => {
34      let new_val = pair
35        .value
36        .split_whitespace()
37        .map(|word| match word {
38          "start" | "insetInlineStart" => "left",
39          "end" | "insetInlineEnd" => "right",
40          _ => word,
41        })
42        .collect::<Vec<_>>()
43        .join(" ");
44      Pair::new(pair.key.clone(), new_val)
45    },
46    "float" | "clear" => logical_to_physical_ltr(pair.value.as_str())
47      .map(|value| Pair::new(pair.key.clone(), value.to_string()))
48      .unwrap_or_else(|| Pair::new(pair.key.clone(), pair.value.clone())),
49    k => {
50      if let Some(&physical) = PROPERTY_TO_LTR.get(k) {
51        Pair::new(physical.to_string(), pair.value.clone())
52      } else {
53        Pair::new(pair.key.clone(), pair.value.clone())
54      }
55    },
56  }
57}