✨ [pagetop] Nuevas macros ...string! y hm! por kv!
This commit is contained in:
parent
0a6d343db8
commit
4db4d791a5
5 changed files with 120 additions and 21 deletions
|
|
@ -122,7 +122,7 @@ pub enum HljsLang {
|
||||||
|
|
||||||
static HLJS_LANGS: LazyLock<HashMap<HljsLang, &'static str>> = LazyLock::new(|| {
|
static HLJS_LANGS: LazyLock<HashMap<HljsLang, &'static str>> = LazyLock::new(|| {
|
||||||
use HljsLang::*;
|
use HljsLang::*;
|
||||||
kv![
|
hm![
|
||||||
// Common languages.
|
// Common languages.
|
||||||
Bash => "bash",
|
Bash => "bash",
|
||||||
C => "c",
|
C => "c",
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,7 @@ pub enum HljsTheme {
|
||||||
|
|
||||||
static HLJS_THEMES: LazyLock<HashMap<HljsTheme, &'static str>> = LazyLock::new(|| {
|
static HLJS_THEMES: LazyLock<HashMap<HljsTheme, &'static str>> = LazyLock::new(|| {
|
||||||
use HljsTheme::*;
|
use HljsTheme::*;
|
||||||
kv![
|
hm![
|
||||||
A11yDark => "a11y-dark",
|
A11yDark => "a11y-dark",
|
||||||
A11yLight => "a11y-light",
|
A11yLight => "a11y-light",
|
||||||
Agate => "agate",
|
Agate => "agate",
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use crate::html::{Markup, PreEscaped};
|
use crate::html::{Markup, PreEscaped};
|
||||||
use crate::{global, kv, AutoDefault};
|
use crate::{global, hm, AutoDefault};
|
||||||
|
|
||||||
pub use fluent_templates;
|
pub use fluent_templates;
|
||||||
pub use unic_langid::{CharacterDirection, LanguageIdentifier};
|
pub use unic_langid::{CharacterDirection, LanguageIdentifier};
|
||||||
|
|
@ -103,7 +103,7 @@ use std::fmt;
|
||||||
/// A mapping between language codes (e.g., "en-US") and their corresponding [`LanguageIdentifier`]
|
/// A mapping between language codes (e.g., "en-US") and their corresponding [`LanguageIdentifier`]
|
||||||
/// and locale key names.
|
/// and locale key names.
|
||||||
static LANGUAGES: LazyLock<HashMap<String, (LanguageIdentifier, &str)>> = LazyLock::new(|| {
|
static LANGUAGES: LazyLock<HashMap<String, (LanguageIdentifier, &str)>> = LazyLock::new(|| {
|
||||||
kv![
|
hm![
|
||||||
"en" => ( langid!("en-US"), "english" ),
|
"en" => ( langid!("en-US"), "english" ),
|
||||||
"en-GB" => ( langid!("en-GB"), "english_british" ),
|
"en-GB" => ( langid!("en-GB"), "english_british" ),
|
||||||
"en-US" => ( langid!("en-US"), "english_united_states" ),
|
"en-US" => ( langid!("en-US"), "english_united_states" ),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ pub use crate::{AutoDefault, ComponentClasses, StaticResources, UniqueId, Weight
|
||||||
// MACROS.
|
// MACROS.
|
||||||
|
|
||||||
// crate::util
|
// crate::util
|
||||||
pub use crate::{join_string, kv};
|
pub use crate::{hm, join_string, option_string, trio_string};
|
||||||
// crate::config
|
// crate::config
|
||||||
pub use crate::include_config;
|
pub use crate::include_config;
|
||||||
// crate::locale
|
// crate::locale
|
||||||
|
|
|
||||||
|
|
@ -146,30 +146,17 @@ pub use paste::paste;
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub use concat_string::concat_string;
|
pub use concat_string::concat_string;
|
||||||
|
|
||||||
/// Concatena varios fragmentos de cadenas en una cadena *String*.
|
|
||||||
///
|
|
||||||
/// Exporta la macro [`concat_string!`](https://docs.rs/concat-string), que permite concatenar de
|
|
||||||
/// forma eficiente fragmentos de cadenas (*string slices*) en una cadena *String*. Acepta cualquier
|
|
||||||
/// número de argumentos que implementen `AsRef<str>` y crea una cadena `String` con el tamaño
|
|
||||||
/// adecuado, sin requerir cadenas de formato que puedan sobrecargar el rendimiento.
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! join_string {
|
/// Macro para construir una colección de pares clave-valor.
|
||||||
($($arg:tt)*) => {
|
|
||||||
$crate::util::concat_string!($($arg)*)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[macro_export]
|
|
||||||
/// Macro para construir grupos de pares clave-valor.
|
|
||||||
///
|
///
|
||||||
/// ```rust#ignore
|
/// ```rust#ignore
|
||||||
/// let args = kv![
|
/// let args = hm![
|
||||||
/// "userName" => "Roberto",
|
/// "userName" => "Roberto",
|
||||||
/// "photoCount" => 3,
|
/// "photoCount" => 3,
|
||||||
/// "userGender" => "male",
|
/// "userGender" => "male",
|
||||||
/// ];
|
/// ];
|
||||||
/// ```
|
/// ```
|
||||||
macro_rules! kv {
|
macro_rules! hm {
|
||||||
( $($key:expr => $value:expr),* $(,)? ) => {{
|
( $($key:expr => $value:expr),* $(,)? ) => {{
|
||||||
let mut a = std::collections::HashMap::new();
|
let mut a = std::collections::HashMap::new();
|
||||||
$(
|
$(
|
||||||
|
|
@ -178,3 +165,115 @@ macro_rules! kv {
|
||||||
a
|
a
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Concatena varios fragmentos de cadenas (*string slices*) en una cadena *String*.
|
||||||
|
///
|
||||||
|
/// Exporta la macro [`concat_string!`](https://docs.rs/concat-string), que permite concatenar de
|
||||||
|
/// forma eficiente fragmentos de cadenas en una cadena *String*. Acepta cualquier número de
|
||||||
|
/// argumentos que implementen `AsRef<str>` y crea una cadena `String` con el tamaño adecuado, sin
|
||||||
|
/// requerir cadenas de formato que puedan sobrecargar el rendimiento.
|
||||||
|
///
|
||||||
|
/// # Ejemplo
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// // Concatena todos los fragmentos directamente.
|
||||||
|
/// let result = join_string!("Hello", " ", "World");
|
||||||
|
/// assert_eq!(result, "Hello World".to_string());
|
||||||
|
///
|
||||||
|
/// // También funciona con valores vacíos.
|
||||||
|
/// let result_with_empty = join_string!("Hello", "", "World");
|
||||||
|
/// assert_eq!(result_with_empty, "HelloWorld".to_string());
|
||||||
|
///
|
||||||
|
/// // Un único fragmento devuelve el mismo valor.
|
||||||
|
/// let single_result = join_string!("Hello");
|
||||||
|
/// assert_eq!(single_result, "Hello".to_string());
|
||||||
|
/// ```
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! join_string {
|
||||||
|
($($arg:tt)*) => {
|
||||||
|
$crate::util::concat_string!($($arg)*)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Concatena varios fragmentos de cadenas (*string slices*) en una cadena *String* utilizando
|
||||||
|
/// opcionalmente un separador.
|
||||||
|
///
|
||||||
|
/// Crea una cadena que contiene los fragmentos no vacíos concatenados. La macro puede utilizar un
|
||||||
|
/// separador explícito o concatenar directamente los fragmentos sin un separador. Acepta cualquier
|
||||||
|
/// número de argumentos que implementen `AsRef<str>`.
|
||||||
|
///
|
||||||
|
/// Si todos los fragmentos son cadenas vacías, devuelve `None`.
|
||||||
|
///
|
||||||
|
/// # Ejemplo
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// // Concatena los fragmentos no vacíos con un espacio como separador.
|
||||||
|
/// let result_with_separator = option_string!(["Hello", "", "World"]; " ");
|
||||||
|
/// assert_eq!(result_with_separator, Some("Hello World".to_string()));
|
||||||
|
///
|
||||||
|
/// // Concatena los fragmentos no vacíos sin un separador.
|
||||||
|
/// let result_without_separator = option_string!(["Hello", "", "World"]);
|
||||||
|
/// assert_eq!(result_without_separator, Some("HelloWorld".to_string()));
|
||||||
|
///
|
||||||
|
/// // Devuelve `None` si todos los fragmentos están vacíos.
|
||||||
|
/// let result_empty = option_string!(["", "", ""]);
|
||||||
|
/// assert_eq!(result_empty, None);
|
||||||
|
/// ```
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! option_string {
|
||||||
|
([$($arg:expr),* $(,)?]) => {{
|
||||||
|
let s = $crate::util::concat_string!($($arg),*);
|
||||||
|
(!s.is_empty()).then_some(s)
|
||||||
|
}};
|
||||||
|
([$($arg:expr),* $(,)?]; $separator:expr) => {{
|
||||||
|
let s = [$($arg),*]
|
||||||
|
.iter()
|
||||||
|
.filter(|&item| !item.is_empty())
|
||||||
|
.cloned()
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join($separator);
|
||||||
|
(!s.is_empty()).then_some(s)
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Concatena dos fragmentos de cadenas (*string slices*) en una cadena *String* con un separador.
|
||||||
|
///
|
||||||
|
/// Concatena los dos fragmentos que implementen `AsRef<str>` usando el separador proporcionado,
|
||||||
|
/// pero devuelve directamente el primer fragmento si el segundo está vacío, o el segundo fragmento
|
||||||
|
/// si el primero está vacío.
|
||||||
|
///
|
||||||
|
/// # Ejemplo
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// let first = "Hello";
|
||||||
|
/// let separator = "-";
|
||||||
|
/// let second = "World";
|
||||||
|
///
|
||||||
|
/// // Concatena los dos fragmentos cuando ambos no están vacíos.
|
||||||
|
/// let result = trio_string!(first, separator, second);
|
||||||
|
/// assert_eq!(result, "Hello-World".to_string());
|
||||||
|
///
|
||||||
|
/// // Si el primer fragmento está vacío, devuelve el segundo.
|
||||||
|
/// let result_empty_first = trio_string!("", separator, second);
|
||||||
|
/// assert_eq!(result_empty_first, "World".to_string());
|
||||||
|
///
|
||||||
|
/// // Si el segundo fragmento está vacío, devuelve el primero.
|
||||||
|
/// let result_empty_second = trio_string!(first, separator, "");
|
||||||
|
/// assert_eq!(result_empty_second, "Hello".to_string());
|
||||||
|
///
|
||||||
|
/// // Si ambos fragmentos están vacíos, devuelve una cadena vacía.
|
||||||
|
/// let result_both_empty = trio_string!("", separator, "");
|
||||||
|
/// assert_eq!(result_both_empty, "".to_string());
|
||||||
|
/// ```
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! trio_string {
|
||||||
|
($first:expr, $separator:expr, $second:expr) => {{
|
||||||
|
if $first.is_empty() {
|
||||||
|
$second.to_string()
|
||||||
|
} else if $second.is_empty() {
|
||||||
|
$first.to_string()
|
||||||
|
} else {
|
||||||
|
$crate::util::concat_string!($first, $separator, $second)
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue