css_inline
é uma biblioteca de alto desempenho para o CSS preenchido nos atributos HTML 'Style'.
Esta biblioteca foi projetada para cenários, como preparar e-mails HTML ou incorporar HTML em páginas da web de terceiros.
Por exemplo, a caixa transforma HTML como este:
<html> <Head> <estilo> h1 {color: azul; } </style> </head> <body> <h1> Big Text </h1> </body> </html>
em:
<html> <Head> </head> <Body> <h1 style = "cor: azul;"> texto grande </h1> </body> </html>
Usa componentes confiáveis do projeto servo de Mozilla
Inlines CSs de tags de style
e link
Remove style
e as tags link
Resolve folhas de estilo externas (incluindo arquivos locais)
Opcionalmente armazenam em cache folhas de estilo externas
Funciona no Linux, Windows e MacOS
Suporta HTML5 e CSS3
Ligações para Python, Ruby, JavaScript, C e um módulo WebAssembly para executar em navegadores.
Interface da linha de comando
Se você quiser experimentar css-inline
, pode verificar o playground de WebAssembly Powed para ver os resultados instantaneamente.
Para incluí -lo em seu projeto, adicione a seguinte linha à seção de dependências na Cargo.toml
do seu projeto.
[Dependências] CSS-Inline = "0,14"
A versão de ferrugem suportada mínima é 1,65.
const html: & str = r#"<html> <head> <style> h1 {color: blue;} </style> </head> <body> <h1> grande texto </h1> </body> <// html> "#; fn main () -> css_inline :: resultado <()> {let inlined = css_inline :: inline (html)?; Algo com HTML inlined, por exemplo, envie um e -mail (())}}
Observe que css-inline
adiciona automaticamente as tags html
e body
ausentes, para que a saída seja um documento HTML válido.
Como alternativa, você pode incluir CSS em um fragmento HTML, preservando a estrutura original:
const Fragment: & str = r#"<main> <h1> Olá </h1> <section> <p> Quem sou eu </p> </section> </rain>"#; const css: & str = r# "P {color: Red;} h1 {color: blue;}"#; fn main () -> css_inline :: resultado <()> {let inlined = css_inline :: inline_fragment (fragmento, css)?; ok (())}
css-inline
pode ser configurado usando CSSInliner::options()
que implementa o padrão do construtor:
const html: & str = "..."; fn main () -> css_inline :: resultado <()> {let inliner = css_inline :: cssinliner :: options (). load_remote_stylesheets (false) .build (); let inlinou = inliner.inline (html)?; // Faça algo com html inlinado, por exemplo, envie um Emailok (())}
inline_style_tags
. Especifica se deve ser o CSS embutido das tags "Style". Padrão: true
keep_style_tags
. Especifica se deve manter as tags de "estilo" após o inline. Padrão: false
keep_link_tags
. Especifica se deve manter as tags de "link" após o inline. Padrão: false
base_url
. O URL base usado para resolver URLs relativos. Se você quiser carregar as folhas de estilo do seu sistema de arquivos, use o file://
esquema. Padrão: None
load_remote_stylesheets
. Especifica se as folhas de estilo remotas devem ser carregadas. Padrão: true
cache
. Especifica o cache para folhas de estilo externas. Padrão: None
extra_css
. CSS extra para ser inlinhado. Padrão: None
preallocate_node_capacity
. Avançado . Pré -loca capacidade para nós HTML durante a análise. Isso pode melhorar o desempenho quando você tiver uma estimativa do número de nós no seu documento HTML. Padrão: 32
Você também pode pular o CSS em preenchimento para uma tag html, adicionando o atributo data-css-inline="ignore"
:
<head> <estilo> h1 {color: azul; } </style> </head> <body> <!-A tag abaixo não receberá estilos adicionais-> <H1 data-css-inline = "ignorar"> Grande texto </h1> </body>
O atributo data-css-inline="ignore"
também permite pular tags link
e style
:
<head> <!-Os estilos abaixo são ignorados-> <style data-css-inline = "ignorar"> h1 {color: blue; } </style> </head> <body> <H1> Grande texto </h1> </body>
Como alternativa, você pode impedir que style
seja removido usando o atributo data-css-inline="keep"
. Isso é útil se você deseja manter as consultas @media
para e -mails responsivos em tags style
separadas:
<head> <!-Os estilos abaixo não são removidos-> <style data-css-inline = "Keep"> h1 {color: blue; } </style> </head> <body> <H1> Big Text </h1> </body>
Tais tags serão mantidas na opção HTML resultante, mesmo que a opção keep_style_tags
esteja definida como false
.
Se você quiser carregar as folhas de estilo do seu sistema de arquivos, use o file://
esquema:
const html: & str = "..."; fn main () -> css_inline :: resultado <()> {let base_url = css_inline :: url :: parse ("arquivo: // styles/email/") .Expect ("URL inválido"); deixe inliner = css_inline :: cssinliner :: options (). base_url (alguns (base_url)). build (); deixe inlined = inliner.inline (html); // faça algo com html inlinado, por exemplo, envie um e -mail ())}}}}}}}
Para resolver folhas de estilo remotas, é possível implementar um resolvedor personalizado:
#[derive (Debug, Padrão)] Pub Struct CustomStyLesheetResolver; Impl CSS_inline :: StylesheetResolver para CustomStylesheetResolver {FN Recuirrie (e self.unsuportd) -> CSS_inline: Result <string> {Err (Err.unsuporth) não suportado "))}} fn main () -> css_inline :: resultado <()> {let inliner = css_inline :: cssinliner :: options (). resolver (std :: sync :: arc :: new (alfabearstylesheetResolver)). build (); ok (()) }
Você também pode cache folhas de estilo externas para evitar solicitações excessivas de rede:
Use STD :: num :: não zoarize;#[cfg (festene = "stylesheet -cache")] fn main () -> css_inline :: resultado <()> {let inliner = css_inline :: cssinliner :: option). cache (// Isso é um LRU CACHECSS_INLINE :: StylesheetCache :: new (não zonderize :: new (5) .Expect ("tamanho do cache inválido")). Not (FeCHENSE = "STILELES -CACHE")]] fn main () -> css_inline :: resultado <()> {OK(())}
O cache está desativado por padrão.
css-inline
normalmente inlines em e-mails HTML dentro de centenas de microssegundos, embora os resultados possam variar com a complexidade de entrada.
Referência para css-inline==0.14.1
:
Básico: 6,44 µs , 230 bytes
Realista-1: 128,59 µs , 8,58 kb
Realista-2: 81,44 µs , 4,3 kb
Github Página: 224,89 ms , 1,81 MB
Esses benchmarks, conduzidos usando rustc 1.78
no M1 Max, podem ser encontrados em css-inline/benches/inliner.rs
.
Instale com cargo
:
cargo install css-inline
O seguinte comando inlina CSS em vários documentos em paralelo. Os arquivos resultantes serão salvos como inlined.email1.html
e inlined.email2.html
:
css-inline email1.html email2.html
Para detalhes completos das opções disponíveis, você pode usar o sinalizador --help
:
css-inline --help
Se você estiver interessado em aprender como essa biblioteca foi criada e como funciona internamente, confira estes artigos:
Crate de ferrugem
Python Bindings
Se você tiver alguma dúvida ou discussão relacionada a esta biblioteca, junte -se ao nosso Gitter!
Este projeto está licenciado nos termos da licença do MIT.