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