File Coverage

blib/lib/Sumi/CSS/Rule.pm
Criterion Covered Total %
statement 31 59 52.5
branch 9 22 40.9
condition 5 8 62.5
subroutine 4 6 66.6
pod 4 4 100.0
total 53 99 53.5


line stmt bran cond sub pod time code
1             package Sumi::CSS::Rule;
2              
3 3     3   20 use Mojo::Base qw/-base -signatures/;
  3         6  
  3         35  
4 3     3   1235 use Storable qw(dclone);
  3         4  
  3         4038  
5              
6             has "selector";
7             has "style";
8              
9             sub type {
10 200     200 1 298 my $self = shift;
11              
12 200         469 my $selector = join ", ", $self->selector->@*;
13              
14 200 100       1464 if ($selector =~ /^\s*\@(media|supports|layer|scope)/) {
    100          
15 28         71 return "block_at"
16             }
17             elsif ($selector =~ /^\s*\@/) {
18 32         97 return "statement_at"
19             }
20             else {
21 140         360 return "style"
22             }
23             }
24              
25             sub to_string_ugly {
26 0     0 1 0 my $self = shift;
27 0         0 my $string = "";;
28 0         0 for ($self->type) {
29 0 0       0 /statement_at/ && do {
30 0   0     0 $string .= sprintf "%s %s;\n", ((join ", ", $self->selector->@*), $self->style || "");
31             last
32 0         0 };
33 0 0       0 /block_at/ && do {
34 0         0 $string .= ((join ", ", $self->selector->@*) . " {");
35 0         0 $string .= $_->to_string for $self->style->@*;
36 0         0 $string .= "}\n"
37             };
38 0 0       0 /style/ && do {
39 0         0 $string .= sprintf "%s %s\n", ((join ", ", $self->selector->@*), $self->style);
40             last
41 0         0 };
42             }
43 0         0 return $string;
44             }
45              
46             sub localized {
47 0     0 1 0 my $self = dclone(shift);
48 0         0 my $lstr = shift;
49              
50 0         0 my $selector = join ", ", $self->selector->@*;
51              
52 0         0 for ($self->type) {
53 0 0       0 /statement_at/ && do { last };
  0         0  
54 0 0       0 /block_at/ && do { $_ = $_->localized($lstr) for $self->style->@*; last; };
  0         0  
  0         0  
55 0 0       0 /style/ && do { $self->selector([ map { join " " , $lstr, $_ } $self->selector->@* ]); last };
  0         0  
  0         0  
  0         0  
56             }
57 0         0 return $self;
58             }
59              
60              
61             sub to_string {
62 200     200 1 498 my ($self, $indent_level, $indent_depth) = @_;
63 200   50     5951 $indent_level //= 0;
64 200   100     725 $indent_depth //= 4;
65              
66 200         429 my $pad = " " x ($indent_depth * $indent_level); # 2-space indentation
67 200         425 my $inner_pad = " " x ($indent_depth * ($indent_level + 1));
68              
69 200         285 my $string = "";
70              
71 200         451 for ($self->type) {
72 200 100       452 /statement_at/ && do {
73 32   100     82 $string .= sprintf "%s%s%s\n",
74             $pad,
75             (join ", ", $self->selector->@*),
76             ($self->style // ";");
77 32         398 last;
78             };
79 168 100       331 /block_at/ && do {
80 28         70 $string .= $pad . (join ", ", $self->selector->@*) . " {\n";
81 28         158 $string .= $_->to_string($indent_level + 1, $indent_depth) for $self->style->@*;
82 28         75 $string .= $pad . "}\n";
83 28         47 last;
84             };
85 140 50       362 /style/ && do {
86 140         333 $string .= sprintf "%s%s %s\n",
87             $pad,
88             (join ", ", $self->selector->@*),
89             $self->style;
90 140         1269 last;
91             };
92             }
93 200         669 return $string;
94             }
95              
96             1;
97              
98              
99             =head1 NAME
100              
101             Sumi::CSS::Rule - A single CSS rule node for Sumi::CSS
102              
103             =head1 SYNOPSIS
104              
105             use Sumi::CSS::Rule;
106              
107             my $rule = Sumi::CSS::Rule->new(
108             selector => ['.foo'],
109             style => 'color: red;'
110             );
111              
112             say $rule->type; # "style"
113             say $rule->to_string; # ".foo color: red;"
114              
115             =head1 DESCRIPTION
116              
117             L represents a single CSS rule, at-rule, or nested block, with type introspection and formatting utilities.
118              
119             =head1 ATTRIBUTES
120              
121             =head2 selector
122              
123             my $sel = $rule->selector;
124             $rule->selector(['.foo', '.bar']);
125              
126             An array reference of selector strings.
127              
128             =head2 style
129              
130             my $style = $rule->style;
131             $rule->style('color: red;');
132              
133             A string or array reference representing the CSS style body.
134             In the case of nested at-rules, this may contain more C objects.
135              
136             =head1 METHODS
137              
138             =head2 type
139              
140             my $type = $rule->type;
141              
142             Returns the rule type, one of:
143              
144             =over 4
145              
146             =item * C