Как я могу объединить определения CSS в файлах в атрибуты встроенного стиля, с помощью Perl?

.NET платформа (библиотеки)

  • Вложенные типы, редко используемые (например, MessageBoxButton должен быть MessageBox.Button)
  • Изменяемые структуры (Rect, Point)
  • Слишком много материала в System пространство имен
  • Слишком много различных понятий равенства (Object.Equals, Object.ReferenceEquals, operator ==, operator !=, IComparable.CompareTo() == 0)
  • , Массивы имеют изменяемых участников, но неизменную длину.

И еще один:

  • XmlSerialization не работает с неизменными типами
8
задан Victor Sanchez 15 November 2018 в 09:27
поделиться

2 ответа

Я не знаю полного, предварительно упакованного решения.

CSS :: DOM compute_style подвержен почти таким же ограничениям как emogrifier выше. Этот модуль в сочетании с HTML :: TokeParser должен быть использован, чтобы что-то приготовить.

Обновление: Вот глючная мешанина вещей:

#!/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)$/;
}
10
ответ дан 5 December 2019 в 12:11
поделиться

Вы можете использовать CSS :: Inliner http://search.cpan.org/dist/CSS-Inliner/

4
ответ дан 5 December 2019 в 12:11
поделиться