#bevy-ui #string #color-string #val #convert-string #parser #css-color

bevy_ui_string_parser

用于bevy-ui的各种值的解析器

3 个版本

0.1.2 2024年2月1日
0.1.1 2024年2月1日
0.1.0 2024年2月1日

#1778解析实现

MIT/Apache

36KB
644

Bevy-UI 字符串解析器工具

License Crates.io Docs

此Rust crate提供了一组解析函数,可用于将字符串转换为各种bevy-ui类型,如ColorValUiRect。语法与CSS匹配,但并不试图完美复制。

它依赖于nom库进行解析。

解析器

颜色

解析颜色值,例如#f0fyellow

use bevy::render::color::Color;
use bevy_ui_string_parser::color_string_parser;
let color: Option<Color> = color_string_parser("#f00");
assert_eq!(color, Some(Color::RED));

支持的语法

  • redblue -> css颜色名称(见https://drafts.csswg.org/css-color/#named-colors
  • #f0f#ff00ff -> 16进制颜色(3或6位数字)
  • #ff00ff00 -> 带alpha的16进制颜色(8位数字)
  • rgb(1.0, 0.0, 0.0) -> rgb颜色(0.0-1.0)
  • rgba(1.0, 0.0, 0.0, 1.0) -> 带alpha的rgb颜色(0.0-1.0)
  • hsl(0.0, 1.0, 0.5) -> hsl颜色(0.0-1.0)
  • hsla(0.0, 1.0, 0.5, 1.0) -> 具有透明度的hsl颜色(0.0-1.0)

Val

解析Val值,例如 1px50%

use bevy::ui::Val;
use bevy_ui_string_parser::val_string_parser;
let value: Option<Val> = val_string_parser("45%");
assert_eq!(value, Some(Val::Percent(45.0)));

支持的语法

  • auto -> Val::Auto
  • 12px -> Val::Px(12.0)
  • 12% -> Val::Percent(12.0)
  • 12vw -> Val::Vw(12.0)
  • 12vh -> Val::Vh(12.0)
  • 12vmin -> Val::VMin(12.0)
  • 12vmax -> Val::VMax(12.0)

Rect

解析UiRect值,例如 25px 50px

此顺序与CSS属性如 paddingmargin 相同,更多信息请参阅 mdn

use bevy::ui::{UiRect, Val};
use bevy_ui_string_parser::rect_string_parser;
let rect: Option<UiRect> = rect_string_parser("50px 100px");
assert_eq!(rect, Some(UiRect::new(
    Val::Px(100.0), Val::Px(100.0), Val::Px(50.0), Val::Px(50.0))));

支持的语法

  • 10px 20px 30px 40px -> top | right | bottom | left
  • 10px 20px 10px -> top | left and right | bottom
  • 10px 20px -> top and bottom | left and right
  • 10px -> top, right, bottom and left

Angle

解析角度为浮点值,例如 180deg,返回弧度。

use bevy_ui_string_parser::angle_string_parser;
let angle: Option<f32> = angle_string_parser("180deg");
assert_eq!(angle, Some(180.0_f32.to_radians()));

支持的语法

  • 180deg -> 3.14159265359
  • 1.3rad -> 1.3
  • 1.3 -> 1.3

Serde

每个解析器还提供 serde 解序列化器 *_serde_parser,例如

use serde::Deserialize;
use std::f32::consts::PI;

#[derive(Deserialize)]
pub struct Foo {
    #[serde(deserialize_with = "bevy_ui_string_parser::angle_serde_parser")]
    pub angle: f32,
}

let foo: Foo = serde_json::from_str(r#"{"angle": "180deg"}"#).unwrap();
assert_eq!(foo.angle, PI);

它需要可选的 serde 功能。

变更日志

  • v0.1.2 将 serde 功能设为可选
  • v0.1.1 添加了README
  • v0.1.0 首次发布

依赖项

约23MB
约419K SLoC