许多电子邮件客户端不喜欢链接的 CSS 样式表,甚至不喜欢嵌入的 CSS 样式表。<style>
标签,而是希望 CSS 在所有标记上作为样式属性内联显示。
- BAD:
<link rel=stylesheet type="text/css" href="/style.css">
- BAD:
<style type="text/css">...</style>
- WORKS:
<h1 style="margin: 0">...</h1>
然而,这种内联样式属性方法管理起来很麻烦。
我找到了适用于 Ruby 和 PHP 的工具,它们将 CSS 文件和一些单独的标记作为输入,并返回合并的结果 - 单个标记文件,其中所有 CSS 都转换为样式属性。
我正在寻找解决此问题的 Perl 解决方案,但我在 CPAN 或搜索 Google 上都没有找到解决方案。有什么指点吗?或者,是否可以组合 CPAN 模块来实现相同的结果?
- Ruby http://premailer.dialect.ca/ http://premailer.dialect.ca/
- PHP http://www.pelagodesign.com/sidecar/emogrifier/ http://www.pelagodesign.com/sidecar/emogrifier/
- Perl ?
我不知道有一个完整的、预先打包的解决方案。
CSS::DOM https://metacpan.org/pod/CSS::DOM's compute_style
受到几乎相同的警告emogrifier多于。该模块与HTML::Toke解析器 https://metacpan.org/pod/HTML::TokeParser应该可以用来做饭。
Update:这是一个有问题的大杂烩:
#!/usr/bin/perl
use strict;
use warnings;
use CSS::DOM;
use File::Slurp;
use HTML::DOM;
use HTML::TokeParser;
die "convert html_file css_file" unless @ARGV == 2;
my ($html_file, $css_file) = @ARGV;
my $html_parser = HTML::TokeParser->new($html_file)
or die "Cannot open '$html_file': $!";
my $sheet = CSS::DOM::parse( scalar read_file $css_file );
while ( my $token = $html_parser->get_token ) {
my $type = $token->[0];
my $text = $type eq 'T' ? $token->[1] : $token->[-1];
if ( $type eq 'S' ) {
unless ( skip( $token->[1] ) ) {
$text = insert_computed_style($sheet, $token);
}
}
print $text;
}
sub insert_computed_style {
my ($sheet, $token) = @_;
my ($tag, $attr, $attrseq) = @$token[1 .. 3];
my $doc = HTML::DOM->new;
my $element = $doc->createElement($tag);
for my $attr_name ( @$attrseq ) {
$element->setAttribute($attr_name, $attr->{$attr_name});
}
my $style = CSS::DOM::compute_style(
element => $element, user_sheet => $sheet
);
my @attrseq = (style => grep { lc $_ ne 'style' } @$attrseq );
$attr->{style} = $style->cssText;
my $text .= join(" ",
"<$tag",
map{ qq/$_='$attr->{$_}'/ } @attrseq );
$text .= '>';
return $text;
}
sub skip {
my ($tag) = @_;
$tag = lc $tag;
return 1 if $tag =~ /^(?:h(?:ead|tml)|link|meta|script|title)$/;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)