stylex_css/css/
generate_ltr.rs1use 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}