Revert "Embed Safe 2.07 into Vend::Safe to avoid various problems with recent version...
[interchange.git] / code / UserTag / css.tag
1 # Copyright 2003-2009 Interchange Development Group and others
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.  See the LICENSE file for details.
7
8 UserTag css Order   name
9 UserTag css addAttr
10 UserTag css Version $Revision: 1.9 $
11 UserTag css Routine <<EOR
12 sub {
13         my ($name, $opt) = @_;
14
15         use vars qw/$Tag/;
16
17         return unless $name;
18
19         my $bn = lc $name;
20         $bn .= '.css';
21
22         my $dir = $opt->{output_dir} ||= 'images';
23
24         my $id = "";
25
26         if (! $opt->{no_imagedir} ) {
27                 $id = $opt->{imagedir} || $Vend::Cfg->{ImageDir};
28                 $id =~ s:/*$:/:;
29         }
30
31         $dir =~ s:/+$::;
32
33         if($opt->{relative}) {
34                 my @dirs = split m{/}, $Global::Variable->{MV_PAGE};
35                 pop @dirs;
36                 if(@dirs) {
37                         $id .= join "/", @dirs, '';
38                         $dir = join "/", $dir, @dirs;
39                 }
40         }
41
42         my $sourcetime;
43         if($opt->{basefile}) {
44                 $sourcetime = (stat($opt->{basefile}))[9];
45 #::logDebug("basefile=$opt->{basefile} sourcetime=$sourcetime");
46         }
47
48         my $url = "$id$bn";
49         my $fn  = "$dir/$bn";
50
51
52         my $write;
53         my $success;
54
55         my @stat = stat($fn);
56         my $writable;
57
58         if(@stat) {
59                 $writable = -w _;
60                 if($opt->{basefile}) {
61                         if($sourcetime > $stat[9]) {
62 #::logDebug("Found a basefile, out of date at modtime=$stat[9]");
63                                 $write = 1;
64                         }
65                         else {
66 #::logDebug("Found a basefile, in date at modtime=$stat[9]");
67                                 $success = 1;
68                         }
69                 }
70                 elsif($opt->{timed}) {
71                         my $now = time();
72                         $opt->{timed} .= ' min' if $opt->{timed} =~ /^\d+$/;
73                         my $fliptime = adjust_time($opt->{timed}, $stat[9]);
74 #::logDebug("fliptime=$fliptime now=$now");
75                         if ($fliptime <= $now) {
76                                 $write = 1;
77                         }
78                         else {
79                                 $success = 1;
80                         }
81                 }
82                 else {
83                         $success = 1;
84                 }
85         }
86         else {
87                 $writable = -w $dir;
88                 $write = 1;
89         }
90
91
92         my $extra = '';
93         $extra .= qq{ media="$opt->{media}"} if $opt->{media};
94
95         my $css;
96         $css = length($opt->{literal})
97                                 ? $opt->{literal}
98                                 : interpolate_html($Tag->var($name));
99         $css =~ s/^\s*<style.*?>\s*//si;
100         $css =~ s:\s*</style>\s*$:\n:i;
101
102         WRITE: {
103                 last WRITE unless $write;
104                 if(! $writable) {
105                         if(@stat) {
106                                 logError("CSS file %s has no write permission.", $fn);
107                         }
108                         else {
109                                 if ( -d $dir ) {
110                                         logError("CSS dir %s has no write permission.", $dir);
111                                 }
112                                 else {
113                                         logError("CSS dir %s does not exist.", $dir);
114                                 }
115                         }
116                         last WRITE;
117                 }
118                 my $mode = $opt->{mode} ? oct($opt->{mode}) : 0644;
119                 $success = $Tag->write_relative_file($fn, $css) && chmod($mode, $fn)
120                         or logError("Error writing CSS file %s, returning in page", $fn);
121         }
122
123         return qq{<link rel="stylesheet" href="$url"$extra>} if $success;
124         return qq{<style type="text/css">\n$css</style>};
125 }
126 EOR