package HTML::DoCoMoCSS; use strict; use warnings; use CSS::Tiny::Style; use CSS::Tiny; use File::Spec; use Carp; use HTML::Selector::XPath 'selector_to_xpath'; use XML::LibXML; our $VERSION = '0.01'; sub new { my $class = shift; my %args = @_; unless (exists $args{base_dir}) { croak "base_dir is required"; } bless {%args}, $class; } sub apply { my ($self, $content) = @_; croak "HTML::DoCoMoCSS->apply is instance method" unless ref $self; # escape Numeric character reference. $content =~ s/&#(\d+);/HTMLCSSINLINERESCAPE$1::::::::/g; my $xml = XML::LibXML->new(); my $doc = $xml->parse_string($content); my @linknodes = $doc->findnodes('//link[@rel="stylesheet"]'); for my $linknode (@linknodes) { my $href = $linknode->getAttribute('href') or next; # read css my $css; if ($href =~ m{^https?://}) { require LWP::UserAgent; my $ua = $self->{user_agent} || LWP::UserAgent->new(agent => __PACKAGE__ . "/$VERSION"); my $res = $ua->get($href); if ($res->is_success) { $css = CSS::Tiny->read_string($res->content) or croak "Can't parse '$href' by @{[ __PACKAGE__ ]}"; } else { croak "can't get $href"; } } else { my $cssfile = File::Spec->catfile( $self->{base_dir}, $href ); $cssfile =~ s/\?.+//g; # remove query string. e.g. /css/mobile.css?d=20070807 $css = CSS::Tiny->read($cssfile) or croak "Can't open '$cssfile' by @{[ __PACKAGE__ ]}"; } # iCSS can use a:link, a:focus, a:visited at