css_inline es una biblioteca de alto rendimiento para insertar CSS en atributos HTML 'estilo'.
Esta biblioteca está diseñada para escenarios como preparar correos electrónicos HTML o integrar HTML en páginas web de terceros.
Por ejemplo, la caja transforma HTML como este:
<html>
<HEAD> <SLEY> H1 {color: azul; } </style>
</ablo)
<body> <h1> Big Text </h1>
</body> </html>en:
<html> <head> </head> <body> <h1 style = "Color: Blue;"> Big Text </h1> </body> </html>
Utiliza componentes confiables del Servo Project de Mozilla
Entrada CSS de etiquetas style y link
Elimina las etiquetas de style y link
Resuelve hojas de estilo externos (incluidos archivos locales)
Opcionalmente, caché hojas de estilo externos
Funciona en Linux, Windows y MacOS
Admite HTML5 y CSS3
ANUCHOS PARA PYTHON, RUBY, JAVASCRIPT, C, y un módulo WebAssembly para ejecutarse en navegadores.
Interfaz de línea de comando
Si desea probar css-inline , puede consultar el patio de recreo con WebAssembly para ver los resultados al instante.
Para incluirlo en su proyecto, agregue la siguiente línea a la sección de dependencias en el archivo Cargo.toml de su proyecto.
[Dependencias] CSS-Inline = "0.14"
La versión mínima de óxido compatible es 1.65.
const html: & str = r#"<html> <fead> <style> h1 {color: blue;} </ystye> </head> <body> <h1> big text </h1> </body> </ html> "#; fn main () -> css_inline :: resultado <()> {dejar inlined = css_inline :: inline (html) ?; // hacer Algo con HTML en línea, por ejemplo, enviar un correo electrónico (())} Tenga en cuenta que css-inline agrega automáticamente las etiquetas html y body faltantes, por lo que la salida es un documento HTML válido.
Alternativamente, puede en línea CSS en un fragmento HTML, preservando la estructura original:
const fragmento: & str = r#"<Rain> <h1> Hola </h1> <section> <p> ¿Quién soy i </p> </section> </main>"#; const css: & str = r# "P {color: rojo;} h1 {color: azul;}"#; fn main () -> css_inline :: resultado <()> {LET inlined = css_inline :: inline_fragment (fragment, css)?; ok (())} css-inline se puede configurar utilizando CSSInliner::options() que implementa el patrón de constructor:
const html: & str = "..."; fn main () -> css_inline :: resultado <()> {let inliner = css_inline :: cssinliner :: options (). Load_remote_stylesheets (falso). = inliner.inline (html)? emailok (())} inline_style_tags . Especifica si se debe en línea CSS de etiquetas de "estilo". Valor predeterminado: true
keep_style_tags . Especifica si mantener las etiquetas de "estilo" después de la incrustación. Valor predeterminado: false
keep_link_tags . Especifica si mantener las etiquetas de "enlace" después de la incrustación. Valor predeterminado: false
base_url . La URL base utilizada para resolver URL relativas. Si desea cargar hojas de estilo desde su sistema de archivos, use el file:// esquema. Valor predeterminado: None
load_remote_stylesheets . Especifica si se deben cargar hojas de estilo remotas. Valor predeterminado: true
cache . Especifica el caché para hojas de estilo externos. Valor predeterminado: None
extra_css . CSS adicional para entradas. Valor predeterminado: None
preallocate_node_capacity . Avanzado . Prealloca la capacidad de los nodos HTML durante el análisis. Esto puede mejorar el rendimiento cuando tiene una estimación del número de nodos en su documento HTML. Valor predeterminado: 32
También puede omitir CSS en la insulta para una etiqueta HTML agregando el atributo data-css-inline="ignore" :
<Evista>
<style> H1 {color: azul; } </style> </head> <body>
<!-La etiqueta a continuación no recibirá estilos adicionales->
<h1 data-css-inline = "ignorar"> Big Text </h1> </body> El atributo data-css-inline="ignore" también le permite omitir las etiquetas link y style :
<Evista>
<!-Los estilos de abajo se ignoran->
<style data-css-inline = "ignorar"> h1 {color: azul; } </style> </head> <body>
<h1> Big Text </h1> </body> Alternativamente, puede evitar que se elimine style utilizando el atributo data-css-inline="keep" . Esto es útil si desea conservar las consultas @media para correos electrónicos receptivos en etiquetas style separadas:
<Evista>
<!-Los estilos de abajo no se eliminan->
<style data-css-inline = "Keep"> H1 {color: azul; } </style> </head> <body>
<h1> Big Text </h1> </body> Dichas etiquetas se mantendrán en el HTML resultante, incluso si la opción keep_style_tags se establece en false .
Si desea cargar hojas de estilo desde su sistema de archivos, use el file:// esquema:
const html: & str = "..."; fn main () -> css_inline :: resultado <()> {Let base_url = css_inline :: url :: parse ("archivo: // styles/correo electrónico/") .Expect ("URL no válida"); Let Inliner = css_inline :: cssinliner :: options (). Base_url (algunos (base_url)). Build (); Let inlined = inliner.inline (html); // Haga algo con html en línea, por ejemplo, envíe un correo electrónicok (())}Para resolver hojas de estilo remoto, es posible implementar un resolución personalizado:
#[Derive (Debug, predeterminado)] Pub Struct CustomStylesheetResolver; implic CSS_INLINE :: StylesHeetResolver para CustomStylesHeetResolver {Fn RomEnele (& Self, Ubicación: & str) -> CSS_Inline :: Result <String> {Err (Self.Unsupported ("Styles Styles son son styles son los estilos que están son styles son los estilos. no admitido "))}} fn main() -> css_inline::Result<()> {let inliner = css_inline::CSSInliner::options().resolver(std::sync::Arc::new(CustomStylesheetResolver)).build();Ok( ())}También puede almacenar en caché las hojas de estilo externos para evitar solicitudes de red excesivas:
Use std :: num :: nonzeroyize;#[cfg (característica = "stylesheet -cache")] fn main () -> css_inline :: resultado <()> {let inliner = css_inline :: cssinliner :: options (). caché (// Esta es una LRU Cachecss_inline :: StylesheetCache :: new (Nonzeroyize :: new (5) .expect ("tamaño de caché inválido"))). Build (); ok (())} // Este bloque está aquí para fines de prueba#[CFG ((CFG ((CFG ((CFG (CFG ( no (característica = "stylesheet -cache"))] fn main () -> css_inline :: result <()>> {De acuerdo(())}El almacenamiento en caché está deshabilitado de forma predeterminada.
css-inline generalmente ingresa los correos electrónicos HTML en cientos de microsegundos, aunque los resultados pueden variar con la complejidad de la entrada.
Puntos de referencia para css-inline==0.14.1 :
Básico: 6.44 µs , 230 bytes
Realistic-1: 128.59 µs , 8.58 kb
Realistic-2: 81.44 µs , 4.3 kb
Página de Github: 224.89 ms , 1.81 MB
Estos puntos de referencia, realizados con rustc 1.78 en M1 Max, se pueden encontrar en css-inline/benches/inliner.rs .
Instalar con cargo :
cargo install css-inline El siguiente comando ingresa CSS en múltiples documentos en paralelo. Los archivos resultantes se guardarán como inlined.email1.html e inlined.email2.html :
css-inline email1.html email2.html Para obtener los detalles completos de las opciones disponibles, puede usar la bandera --help :
css-inline --helpSi está interesado en saber cómo se creó esta biblioteca y cómo funciona internamente, consulte estos artículos:
Caja de óxido
Pitón ataduras
Si tiene alguna pregunta o discusión relacionada con esta biblioteca, ¡únase a nuestro Gitter!
Este proyecto tiene licencia bajo los términos de la licencia MIT.